我有以下课程:
public class MyClass {
private Apple apple;
public void myMethod() {
apple = AppleFactory.createInstance(someStringVariable);
....
....
....
}
}
和测试类:
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@InjectMocks
MyClass myClass;
@Test
public void myMethod(){
...
...
...
}
}
如何在MyClass中将Apple实例作为模拟注入?
您可以通过3种方式解决此问题:
抽象工厂 :使用具体的工厂类,而不是使用静态方法:
public abstract class AppleFactory {
public Apple createInstance(final String str);
}
public class AppleFactoryImpl implements AppleFactory {
public Apple createInstance(final String str) { // Implementation }
}
在测试类中,模拟工厂:
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@Mock
private AppleFactory appleFactoryMock;
@Mock
private Apple appleMock;
@InjectMocks
MyClass myClass;
@Before
public void setup() {
when(appleFactoryMock.createInstance(Matchers.anyString()).thenReturn(appleMock);
}
@Test
public void myMethod(){
...
...
...
}
}
PowerMock
:使用PowerMock创建静态方法的模拟。查看我对一个相关问题的答案,看看它是如何完成的。
可测试的类 :将Apple
创建的内容包装在protected
方法中,并创建一个覆盖它的测试类:
public class MyClass {
private Apple apple;
public void myMethod() {
apple = createApple();
....
....
....
}
protected Apple createApple() {
return AppleFactory.createInstance(someStringVariable);
}
}
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@Mock
private Apple appleMock;
@InjectMocks
MyClass myClass;
@Test
public void myMethod(){
...
...
...
}
private class TestableMyClass extends MyClass {
@Override
public void createApple() {
return appleMock;
}
}
}
当然,在测试课程中,您应该测试TestableMyClass
而不是MyClass
。
我会告诉您我对每种方法的看法:
抽象工厂方法 是最好的 方法-这是一个清晰的设计,隐藏了实现细节
可测试的类-是需要最少更改的第二个选项
该PowerMock
选项是我最不喜欢的-您无需寻求更好的设计,而忽略并隐藏了问题。但这仍然是一个有效的选择。
我有一个@InjectMocks对象,在我的测试类中使用@InjectMocks时,我需要模拟它抛出的NPE 下面是我的班级结构 你能建议如何模仿这个MyService对象吗。我已经使用了@Mock和@Injected Mock,但在获得NPE时不起作用。我尝试注入基类和父类,但没有成功。
公共类DoSomething{private static final Logger Logger=LoggerFactory.getLogger(DoSomething.class); 我试图创建一个LogMessage的对象。并在DoSomething类的方法中使用它。这是好的还是我应该移动方法中的行?
为什么我们创建一个类的对象,而分配给不同类的引用类型。我有两个类,分别是Employee和Student,创建对象的目的是什么 这是怎么工作的?在什么情况下我们创建这样的对象?
所以我有一个简单的java类: ClassA包含: B类: 我的测试设置如下所示: 问题是ClassB不是为ClassA注入的。 然后通过classA调用returnObject(ClassB),它返回NullPointerException(ClassB不是模拟/注入的)。 如果通过IWantToTestThisClass调用returObject(class B),则可以。 这是同时为两个类注
问题内容: 创建新对象和依赖项注入有什么区别?请详细说明。 问题答案: 好吧,创建一个新对象就可以做到的很明确-您可以创建所需类的新实例。 依赖注入是一种在需要时为您提供引用的机制。想象一下一个代表数据库连接池的类- 您通常只有一个该类的实例。现在,您需要将该引用分发给使用它的所有类。依赖注入在这里很方便- 通过使用像Spring这样的DI框架,您可以定义将一个池实例注入到需要它的类中。 您的问题