Java 中的模拟工厂模式

Mocking factory pattern in Java

它看起来可能与我的 相似。我有一个简单的动物工厂。

public class AnimalFactory {

    public Animal getAnimal(String type) {
        if ("canine".equals(type)) {
            return new Dog();
        } else {
            return new Cat();
        }
    }

}

和 class 对于

public interface Animal {
    void makeSound();
}

public class Dog extends Animal {
    void makeSound() {
    }
}

public class Dog extends Animal {
    void makeSound() {
    }
}

我有些疑惑。 AnimalFactory是否违反了依赖倒置原则?是否可以在不调用实际的 DogCat class 的情况下对 AnimalFactory 进行单元测试,或者我是否必须重构我的代码?

如果没有要注入的依赖项,就没有违反依赖倒置原则。

无论如何,Factory 是一个创造性的 设计模式,您应该测试它确实创建(实例化)了正确的东西。

是的,您应该测试它确实 return 个对象,其中 instanceof Doginstanceof Cat 为真。

如果您必须在不实际调用 DogCat 的构造函数的情况下测试您的工厂(由于它们所做的初始化),我建议像这样重构工厂 class :

public class AnimalFactory {
    public Animal createAnimal(String type) {
        if ("canine".equals(type)) {
            return createDog();
        } else {
            return createCat();
        }
    }

    Dog createDog() { return new Dog(); }

    Cat createCat() { return new Cat(); }
}

测试将如下所示:

public class AnimalFactoryTest {
    @Test
    public void testCreateDog() throws Exception {
        AnimalFactory mockFactory = mock(AnimalFactory.class);
        when(mockFactory.createAnimal(anyString())).thenCallRealMethod();

        mockFactory.createAnimal("canine");
        verify(mockFactory).createDog();
    }

    @Test
    public void testCreateCat() throws Exception {
        AnimalFactory mockFactory = mock(AnimalFactory.class);
        when(mockFactory.createAnimal(anyString())).thenCallRealMethod();

        mockFactory.createAnimal("cat");
        verify(mockFactory).createCat();
    }
}

顺便说一下,Factory 模式方法的命名约定是 createXyz 而不是 getXyz

祝你好运。