Помимо богатых возможностей по сравнению аргументов, EasyMock позволяет подсмотреть, какой-же фактически аргумент был передан.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public class captureTest {
@Rule
public EasyMockRule em = new EasyMockRule(this);
@Mock(type = MockType.DEFAULT)
private GroupRepository groupRepository;
@Mock(type = MockType.DEFAULT)
private UserRepository userRepository;
@TestSubject
private UserService testedObject = new UserService();
@Test
public void simpleCaptureTest() {
Capture<User> actual = EasyMock.newCapture();
userRepository.save(capture(actual));
replay(userRepository);
testedObject.create("TEST");
if (!actual.hasCaptured()) {
fail("Save argument is not valid");
}
assertThat(actual.getValue(), is(testUser()));
}
}
|
capture() это фактически матчер, поэтому его можно использовать в связке с любыми другими матчерами. Созданный capture объект может быть использовать в нескольких вызовах, но запомнит результат только последнего вызова. Это поведение можно изменить при создании capture объекта:
1
2
3
4
5
|
Capture<User> first = EasyMock.newCapture(CaptureType.FIRST)
Capture<User> all = EasyMock.newCapture(CaptureType.ALL)
Capture<User> last = EasyMock.newCapture(CaptureType.LAST)
|
CaptureType.FIRST захватывает результат первого вызова, CaptureType.LAST захыватывает результат последнего вызова (это поведение по умолчанию). CaptureType.ALL сохраняет все результаты всех вызовов. Результаты можно получить вызовом getValues(), который вернёт список результатов:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
@Test
public void multipleCaptureTest() {
Capture<User> actual = EasyMock.newCapture(CaptureType.ALL);
userRepository.save(capture(actual));
expectLastCall().anyTimes();
replay(userRepository);
testedObject.create("TEST");
testedObject.create("SECOND");
if (!actual.hasCaptured()) {
fail("Save argument is not valid");
}
assertThat(actual.getValues().get(0).getUsername(), is("TEST"));
assertThat(actual.getValues().get(1).getUsername(), is("SECOND"));
/**
* Throws java.lang.AssertionError: More than one value captured
*/
//assertThat(actual.getValue(), is(testUser()));
}
|
Код примера доступен на github.