trd*_*ngy 5 java unit-testing jmockit
首先,我定义了一个类,比如说Robot.
public class Robot {
private Vision vision;
public Object recognizeObject(List<List<Integer>> frames) {
vision = new Vision();
return vision.recognize(frames);
}
}
Run Code Online (Sandbox Code Playgroud)
的类Robot有几个依赖项,其中之一是Vision.
public class Vision {
public Object recognize(List<List<Integer>> frames) {
// do magic stuff, but return dummy stuff
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在测试类中,我简单地测试了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;
}};
}
}
Run Code Online (Sandbox Code Playgroud)
基于这些测试,我认为@Mocked,@Injectable和@Capturing可以互换使用。
那是对的吗?
如果答案是否定的,那么有没有什么情况下只
@Mocked/ @Injectable/@Capturing是可能的,不能被其他所替代?
Lpp*_*Edd 12
@Injectable模拟单个实例(例如测试方法的参数)。并非在测试上下文中使用的每个实例。@Mocked 将在测试上下文中创建的每个实例上模拟所有类方法和构造函数。@Capturing基本上与 相同@Mocked,但它将模拟扩展到注释类型的每个子类型(方便!)。的另一个区别@Injectable是,只有标有此注释的字段才会考虑注入@Tested实例内部。
区别现在应该很清楚了。