首先,我定义了一个类,比如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是可能的,而不能被其他的情况所取代?发布于 2019-02-16 16:03:46
@Injectable模拟单个实例(例如,测试方法的参数)。并不是测试上下文中使用的每个实例。@Mocked将在测试上下文中创建的每个实例上模拟所有类方法和构造函数。@Capturing与@Mocked基本相同,但它将模拟扩展到带注释的类型的每个子类型(方便!)。@Injectable的另一个不同之处在于,只有标记有此注释的字段才会考虑在@Tested实例中注入。
现在差别应该很明显了。
https://stackoverflow.com/questions/54724739
复制相似问题