{"id":17197707,"url":"https://github.com/dmcg/fakir","last_synced_at":"2026-04-02T02:02:26.092Z","repository":{"id":31315720,"uuid":"34878138","full_name":"dmcg/fakir","owner":"dmcg","description":"Fakir fakes difficult to build objects","archived":false,"fork":false,"pushed_at":"2020-10-13T10:13:51.000Z","size":82,"stargazers_count":22,"open_issues_count":4,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-13T20:52:08.789Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dmcg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-04-30T21:39:39.000Z","updated_at":"2021-03-01T07:59:53.000Z","dependencies_parsed_at":"2022-09-14T04:51:22.531Z","dependency_job_id":null,"html_url":"https://github.com/dmcg/fakir","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/dmcg/fakir","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmcg%2Ffakir","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmcg%2Ffakir/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmcg%2Ffakir/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmcg%2Ffakir/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dmcg","download_url":"https://codeload.github.com/dmcg/fakir/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmcg%2Ffakir/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268401594,"owners_count":24244464,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-02T02:00:12.353Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-15T01:57:07.301Z","updated_at":"2026-04-02T02:02:21.040Z","avatar_url":"https://github.com/dmcg.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\nFakir - The Ascetic Wonder-Worker\n=================================\n\nFake difficult-to-build objects with default property values and custom overrides.\n\n[ExampleTest](src/test/java/com/oneeyedmen/fakir/ExampleTest.java)\n\n```java\n\n    // We've all got classes like this, coupled for good reasons, really\n    // hard to build.\n\n    public static class Customer {\n        public Customer(Long id, String firstName, String lastName, Date dob, Address address, List\u003cOrder\u003e orders) {\n            //\n        }\n\n        public Long id() { return something(); }\n        public String getFirstName() { return something(); }\n        public String getLastName() { return something(); }\n        public int rank() { return something(); }\n        public Address getAddress() { return something(); }\n        public List\u003cOrder\u003e getOrders() { return something(); }\n        public void printOn(PrintStream s) { s.println(\"Hello\"); }\n        public Customer getAffiliate() { return something(); }\n    }\n\n    public static class Address {\n        public Address(Long id, String line1, String line2, String postcode) {\n            // ...\n        }\n\n        public Long id() { return something(); }\n        public String getLine1() { return something(); }\n        public String getLine2() { return something(); }\n        public String getPostcode() { return something(); }\n    }\n\n    public static class Order {\n        public Order(Long id, Customer customer, Address shippedTo, BigDecimal shippingCost, List\u003cOrderItem\u003e items) {\n            // ...\n        }\n\n        public Long id() { return something(); }\n        public Customer getCustomer() { return something(); }\n        public Address getShippedTo() { return something(); }\n        public BigDecimal getShippingCost() { return something(); }\n        public OrderStatus getStatus() { return something(); }\n        public void setStatus(OrderStatus status) {}\n    }\n\n    public static class OrderItem {\n        public OrderItem(Long id, Order order, Product product, BigDecimal quantity, BigDecimal net, BigDecimal gross, String notes) {\n            //...\n        }\n        //...\n    }\n\n    public abstract class Product {\n        public Product(Long id, String description, Object ... andSoOnAndSoOn) {}\n    }\n\n    public enum OrderStatus {\n        PLACED, PICKED, DISPATCHED, RECEIVED, RETURNED\n    }\n\n    // To build a Customer, you need an Address, some Orders, some OrderItems, some Products...\n\n    // Fakir to the rescue!\n\n    @Test public void fakir_can_build_you_a_customer_in_one_line() {\n        Customer customer = Faker.fakeA(Customer.class);\n        assertTrue(customer instanceof Customer);\n    }\n\n    @Test public void it_fakes_string_properties_to_return_their_name() {\n        Customer customer = Faker.fakeA(Customer.class);\n        assertEquals(\"firstName\", customer.getFirstName());\n        assertEquals(\"lastName\", customer.getLastName());\n    }\n\n    @Test public void primitive_properties_have_defaults_too() {\n        Customer customer = Faker.fakeA(Customer.class);\n        assertEquals(42, customer.rank());\n        assertEquals(Long.valueOf(54), customer.id());\n    }\n\n    @Test public void enums_default_to_the_first() {\n        Order order = Faker.fakeA(Order.class);\n        assertEquals(OrderStatus.PLACED, order.getStatus());\n    }\n\n    @Test public void you_can_override_properties_with_fields() {\n        Customer customer = new Faker\u003cCustomer\u003e() {\n            String firstName = \"fred\";\n            int rank = 24;\n            Customer affiliate = null;\n        }.get();\n        assertEquals(\"fred\", customer.getFirstName());\n        assertEquals(\"lastName\", customer.getLastName());\n        assertEquals(24, customer.rank());\n        assertNull(customer.getAffiliate());\n    }\n\n    @Test public void and_fake_operations_with_methods() {\n        Customer customer = new Faker\u003cCustomer\u003e() {\n            void printOn(PrintStream s) {\n                s.println(\"kumquat\");\n            }\n        }.get();\n\n        ByteArrayOutputStream os = new ByteArrayOutputStream();\n        customer.printOn(new PrintStream(os));\n        assertEquals(\"kumquat\\n\", os.toString());\n    }\n\n    @Test public void operations_are_ignored_unless_overridden() {\n        Order order = Faker.fakeA(Order.class);\n        order.setStatus(OrderStatus.DISPATCHED);\n        assertEquals(OrderStatus.PLACED, order.getStatus());\n    }\n\n    @Test public void but_you_can_back_properties_with_fields() {\n        Order order = new Faker\u003cOrder\u003e() {\n            OrderStatus status = OrderStatus.RECEIVED;\n        }.get();\n        assertEquals(OrderStatus.RECEIVED, order.getStatus());\n\n        order.setStatus(OrderStatus.RETURNED);\n        assertEquals(OrderStatus.RETURNED, order.getStatus());\n    }\n\n    @Test public void object_properties_are_faked_recursively_and_cached() {\n        Customer customer = Faker.fakeA(Customer.class);\n        Address address = customer.getAddress();\n        assertEquals(\"postcode\", address.getPostcode());\n\n        assertSame(address, customer.getAddress());\n        assertNotSame(address, Faker.fakeA(Customer.class).getAddress());\n    }\n\n    @Test public void lists_are_faked_with_2_entries() {\n        Customer customer = Faker.fakeA(Customer.class);\n        assertEquals(2, customer.getOrders().size());\n        assertEquals(\"line1\", customer.getOrders().get(1).getShippedTo().getLine1());\n    }\n\n    @Test public void you_can_install_your_own_factory() {\n        DefaultFactory factory = new DefaultFactory() {\n            protected BigDecimal createBigDecimal() {\n                return new BigDecimal(\"99.99\");\n            }\n\n            protected \u003cT\u003e List\u003cT\u003e createList(Class\u003cT\u003e genericType) {\n                return new FakeList\u003cT\u003e(1, genericType, this);\n            }\n        };\n\n        Customer customer = Faker.fakeA(Customer.class, factory);\n        assertEquals(BigDecimal.valueOf(99.99), customer.getOrders().get(0).getShippingCost());\n        assertEquals(1, customer.getOrders().size());\n    }\n\n    @Test public void and_of_course_combine_that_with_overrides() {\n        DefaultFactory factory = new DefaultFactory() {\n            protected BigDecimal createBigDecimal() {\n                return new BigDecimal(\"99.99\");\n            }\n        };\n\n        Customer customer = new Faker\u003cCustomer\u003e(Customer.class, factory) {\n            int rank = 101;\n        }.get();\n        assertEquals(101, customer.rank());\n        assertEquals(BigDecimal.valueOf(99.99), customer.getOrders().get(0).getShippingCost());\n    }\n\n    @Test public void you_can_explicitly_return_fakes_from_fakes() {\n        Customer customer = new Faker\u003cCustomer\u003e() {\n            Address address = new Faker\u003cAddress\u003e() {\n                String line1 = \"10 Downing St\";\n            }.get();\n        }.get();\n        assertEquals(\"10 Downing St\", customer.getAddress().getLine1());\n        assertEquals(\"postcode\", customer.getAddress().getPostcode());\n    }\n\n    @Test public void and_if_you_do_you_can_use_the_fields_from_any_old_object() {\n        Customer customer = new Faker\u003cCustomer\u003e() {\n            Object address = new Object() {\n                String line1 = \"10 Downing St\";\n            };\n        }.get();\n        assertEquals(\"10 Downing St\", customer.getAddress().getLine1());\n        assertEquals(\"line2\", customer.getAddress().getLine2());\n    }\n\n    @Test public void which_leads_to_another_way_of_overriding_at_the_top_level() {\n        Customer customer = Faker.wrapWith(Customer.class,\n            new Object() {\n                String firstName = \"fred\";\n        });\n        assertEquals(\"fred\", customer.getFirstName());\n    }\n\n    @Test public void this_can_be_extended_to_create_spies_on_existing_instances() {\n        // Feature for next release\n        // Customer existingCustomer = Faker.fakeA(Customer.class);\n        //\n        // Customer customer = Faker.spyOn(existingCustomer,\n        //     new Object() {\n        //         String firstName = \"fred\";\n        //     });\n        // assertEquals(\"fred\", customer.getFirstName());\n    }\n\n    public interface CustomerService {\n        Customer find(Long id);\n    }\n\n    @Test public void and_as_we_lean_so_heavily_on_jmock_we_give_back_an_action() {\n        Mockery mockery = new Mockery();\n        final CustomerService customers = mockery.mock(CustomerService.class);\n        mockery.checking(new Expectations() {{\n            allowing(customers); will(ReturnAFakeAction.returnAFake());\n        }});\n\n        assertEquals(\"postcode\", customers.find(99L).getAddress().getPostcode());\n    }\n\n```\n\nFakir builds and runs under JDK6, but now has some [Java8'y goodness](java8/src/test/java/com/oneeyedmen/fakir/java8/Java8ExampleTest.java)\nfor easy testing of legacy code.\n\n```java\n\n    @Test public void faker_will_delegate_to_suppliers() {\n        Customer customer = new Faker\u003cCustomer\u003e() {\n            Supplier\u003cLong\u003e id = () -\u003e Math.round(Long.MAX_VALUE * Math.random());\n        }.get();\n        assertNotEquals(\"OK, it's contrived, but you get the point\", customer.id(), customer.id());\n    }\n\n    @Test public void which_can_solve_some_circular_dependency_issues() {\n        List\u003cCustomer\u003e customers = new ArrayList\u003c\u003e(2);\n        Object[] customerData = {\n            new Object() {\n                String lastName = \"Flintstone\";\n                Supplier\u003cCustomer\u003e affiliate = () -\u003e customers.get(1);\n            },\n            new Object() {\n                Supplier\u003cString\u003e lastName = () -\u003e customers.get(0).getLastName();\n            }\n        };\n        stream(customerData).map(data -\u003e Faker.wrapWith(Customer.class, data)).forEach(customers::add);\n\n        assertEquals(\"Flintstone\", customers.get(0).getLastName());\n        assertEquals(\"Flintstone\", customers.get(1).getLastName());\n        assertEquals(customers.get(1), customers.get(0).getAffiliate());\n        assertEquals(customers.get(1), customers.get(0).getAffiliate());\n    }\n\n    @Test\n    public void you_cant_cast_a_faker_to_a_Java8_supplier() {\n        try {\n            Faker\u003cCustomer\u003e faker = new Faker\u003cCustomer\u003e() {\n                String firstName = \"Fred\";\n            };\n            Supplier\u003cCustomer\u003e java8Supplier = (Supplier\u003cCustomer\u003e) faker;\n            fail(\"A shame, but nevermind\");\n        } catch (ClassCastException ignored) {\n        }\n    }\n\n    @Test public void but_you_can_finesse_it() {\n        Supplier\u003cCustomer\u003e java8Supplier = new Faker\u003cCustomer\u003e() {\n            String firstName = \"Fred\";\n        }::get;\n    }\n\n    @Test public void and_use_that_to_generalise() {\n        Supplier\u003cCustomer\u003e java8Supplier = asSupplier(new Faker\u003cCustomer\u003e() {\n            String firstName = \"Fred\";\n        });\n    }\n\n    private \u003cT\u003e Supplier\u003cT\u003e asSupplier(com.oneeyedmen.fakir.Supplier\u003cT\u003e faker) {\n        return faker::get;\n    }\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmcg%2Ffakir","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdmcg%2Ffakir","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmcg%2Ffakir/lists"}