@Mocked、@Injectable 和@Capturing 之间有什么区别?
What are the differences between @Mocked, @Injectable, and @Capturing?
首先,我定义一个class,比方说Robot
。
public class Robot {
private Vision vision;
public Object recognizeObject(List<List<Integer>> frames) {
vision = new Vision();
return vision.recognize(frames);
}
}
Class of Robot
有几个依赖项,其中之一是 Vision
.
public class Vision {
public Object recognize(List<List<Integer>> frames) {
// do magic stuff, but return dummy stuff
return null;
}
}
然后在测试class中,我简单测试一下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
将在测试上下文中创建的每个实例上模拟所有 class 方法和构造函数。
@Capturing
与 @Mocked
基本相同,但它将模拟扩展到注释类型的每个子类型(方便!)。
@Injectable
的另一个区别是只有标有此注释的字段才被考虑注入到 @Tested
个实例中。
区别现在应该很清楚了。
首先,我定义一个class,比方说Robot
。
public class Robot {
private Vision vision;
public Object recognizeObject(List<List<Integer>> frames) {
vision = new Vision();
return vision.recognize(frames);
}
}
Class of Robot
有几个依赖项,其中之一是 Vision
.
public class Vision {
public Object recognize(List<List<Integer>> frames) {
// do magic stuff, but return dummy stuff
return null;
}
}
然后在测试class中,我简单测试一下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
将在测试上下文中创建的每个实例上模拟所有 class 方法和构造函数。@Capturing
与@Mocked
基本相同,但它将模拟扩展到注释类型的每个子类型(方便!)。
@Injectable
的另一个区别是只有标有此注释的字段才被考虑注入到 @Tested
个实例中。
区别现在应该很清楚了。