首页 > 解决方案 > @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可以互换使用。

标签: javaunit-testingjmockit

解决方案


  • @Injectable模拟单个实例(例如测试方法的参数)。并非在测试上下文中使用的每个实例。
  • @Mocked将在测试上下文中创建的每个实例上模拟所有类方法和构造函数。
  • @Capturing与 基本相同@Mocked,但它将模拟扩展到注释类型的每个子类型(方便!)。

的另一个区别@Injectable是,只有标有此注释的字段才会考虑在@Tested实例内注入。

区别现在应该很清楚了。


推荐阅读