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
是否违反了依赖倒置原则?是否可以在不调用实际的 Dog
和 Cat
class 的情况下对 AnimalFactory
进行单元测试,或者我是否必须重构我的代码?
如果没有要注入的依赖项,就没有违反依赖倒置原则。
无论如何,Factory
是一个创造性的 设计模式,您应该测试它确实创建(实例化)了正确的东西。
是的,您应该测试它确实 return 个对象,其中 instanceof Dog
和 instanceof Cat
为真。
如果您必须在不实际调用 Dog
和 Cat
的构造函数的情况下测试您的工厂(由于它们所做的初始化),我建议像这样重构工厂 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
。
祝你好运。
它看起来可能与我的
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
是否违反了依赖倒置原则?是否可以在不调用实际的 Dog
和 Cat
class 的情况下对 AnimalFactory
进行单元测试,或者我是否必须重构我的代码?
如果没有要注入的依赖项,就没有违反依赖倒置原则。
无论如何,Factory
是一个创造性的 设计模式,您应该测试它确实创建(实例化)了正确的东西。
是的,您应该测试它确实 return 个对象,其中 instanceof Dog
和 instanceof Cat
为真。
如果您必须在不实际调用 Dog
和 Cat
的构造函数的情况下测试您的工厂(由于它们所做的初始化),我建议像这样重构工厂 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
。
祝你好运。