首先,我定义一个类,让我们说Robot
。
public class Robot {
private Vision vision;
public Object recognizeObject(List<List<Integer>> frames) {
vision = new Vision();
return vision.recognize(frames);
}
}
Robot
的类具有多个依赖项,其中之一是Vision
。public class Vision {
public Object recognize(List<List<Integer>> frames) {
// do magic stuff, but return dummy stuff
return null;
}
}
然后在测试类中,我仅测试recognize()
的调用。@RunWith(JMockit.class)
public class RobotTest {
@Test
public void recognizeObjectWithMocked(@Mocked final Vision vision) {
List<List<Integer>> frames = new ArrayList<>();
vision.recognize(frames);
new Verifications() {{
vision.recognize((List<List<Integer>>) any);
times = 1;
}};
}
@Test
public void recognizeObjectWithInjectable(@Injectable final Vision vision) {
List<List<Integer>> frames = new ArrayList<>();
vision.recognize(frames);
new Verifications() {{
vision.recognize((List<List<Integer>>) any);
times = 1;
}};
}
@Test
public void recognizeObjectWithCapturing(@Capturing final Vision vision) {
List<List<Integer>> frames = new ArrayList<>();
vision.recognize(frames);
new Verifications() {{
vision.recognize((List<List<Integer>>) any);
times = 1;
}};
}
}
基于这些测试,我认为@Mocked
,@Injectable
和@Capturing
可以互换使用。@Mocked
/@Injectable
/@Capturing
是可能的,不能替换为另一个?
最佳答案
@Injectable
模拟单个实例(例如测试方法的参数)。并非每个实例都在测试上下文中使用。 @Mocked
将在测试上下文中创建的每个实例上模拟所有类方法和构造函数。 @Capturing
与@Mocked
基本相同,但是它将模拟扩展到带注释类型的每个子类型(方便!)。 @Injectable
的另一个区别是,仅将标记有此批注的字段考虑为在@Tested
实例内部注入(inject)。区别现在应该很清楚了。
关于java - @ Mocked,@ Injectable和@Capturing有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54724739/