I'm using Junit5 for test my spring code.
In the test code, I mock SetRepository, to make the getSize() method return value 40. Then I stubbed ListService's findSetSize() method and made it return value 30.
Then print the getSize() method value. Expected 40, but 30 printed.
It looks likegetSize() was overwritten while stubbing, but I'd like to know why.
// ListService.java
@Service
@RequiredArgsConstructor
public class ListService {
private final SetRepository setRepository;
public int findSetSize() {
int size = setRepository.getSize();
System.out.println(size); // first result: 40, second result: 30
return size;
}
public void saveToSet(int num) {
setRepository.saveNum(num);
}
}
// SetRepository.java
@Component
public class SetRepository {
Set<Integer> set = new HashSet<>();
public int getSize() {
return set.size();
}
public void saveNum(int num) {
set.add(num);
}
}
// Test code for ListService
@ExtendWith(MockitoExtension.class)
public class ListServiceWithMockTest {
@InjectMocks
@Spy
ListService subject;
@Mock
SetRepository setRepository;
@Test
@DisplayName("can get Set size")
public void findSetSizeTest() {
//given
when(setRepository.getSize()).thenReturn(40);
when(subject.findSetSize()).thenReturn(30);
//when
subject.saveToSet(100);
//then
System.out.println(setRepository.getSize()); // expected:40, result: 30
assertEquals(30, subject.findSetSize());
}
}
Here is my code. I know I shouldn't do stubbing like this, but I'm curious why the value comes out like this. Thank U!!