@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


翻阅古今
浏览 295回答 1
1回答

莫回无

@Injectable模拟单个实例(例如测试方法的参数)。并非在测试上下文中使用的每个实例。@Mocked将在测试上下文中创建的每个实例上模拟所有类方法和构造函数。@Capturing与 基本相同@Mocked,但它将模拟扩展到注释类型的每个子类型(方便!)。的另一个区别@Injectable是,只有标有此注释的字段才会考虑在@Tested实例内注入。区别现在应该很清楚了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java