java - @Mocked、@Injectable 和 @Capturing 之间有什么区别?
问题描述
首先,我定义了一个类,比如说Robot
.
public class Robot {
private Vision vision;
public Object recognizeObject(List<List<Integer>> frames) {
vision = new Vision();
return vision.recognize(frames);
}
}
Class ofRobot
有几个依赖项,其中之一是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
实例内注入。
区别现在应该很清楚了。
推荐阅读
- go - 执行测试时找不到 Go 模块包
- angular - 生产构建后,Websocket 在 Angular 中不起作用
- api - 来自浏览器和 curl 的 HTTP 请求的区别
- sql - 将uuid []列的数据迁移到另一个表,并在传输时从数组中删除重复项
- linux - 错误:快照“包”正在进行“安装快照”更改
- r - 将运行平均值添加到 R 中的数据帧
- firebase - 颤振火力基地 | 相关的导致错误的小部件是 StreamBuilder
> - docker-compose - 从容器运行 Azure Data Studio?
- java - 是否可以使用逻辑运算符移动 Java BitSet?
- c# - 不允许使用其他,不知道我需要如何解决这个问题