First, I define a class, let's say Robot
.
public class Robot {
private Vision vision;
public Object recognizeObject(List<List<Integer>> frames) {
vision = new Vision();
return vision.recognize(frames);
}
}
Class of Robot
has several dependencies, one of them is Vision
.
public class Vision {
public Object recognize(List<List<Integer>> frames) {
// do magic stuff, but return dummy stuff
return null;
}
}
Then in the test class, I simply test the invocation of 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;
}};
}
}
Based on these tests, I think that @Mocked
, @Injectable
, and @Capturing
can be used interchangeably.
Is that correct?
If the answer is no, then is there any case that only
@Mocked
/@Injectable
/@Capturing
is possible and cannot be replaced by
other one?
@Injectable
mocks a single instance (e.g. a test method's parameter). Not every instance used inside the test context.@Mocked
will mock all class methods and constructors on every instance created inside the test context.@Capturing
is basically the same as @Mocked
, but it extends mocking to every subtype of the annotated type (convinient!).Another difference of @Injectable
is that only fields marked with this annotation are considered for injection inside @Tested
instances.
The difference should be pretty clear now.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With