I'm still newbie in coding and javaspring, please help me solve unit test with this service especialy for kelompok.setUser(user) that use return from user service. I'm using Junit5 and easy random.
I have service like this
@Slf4j
@Service
@Transactional
public class KelompokService {
@Autowired
private KelompokRepository kelompokRepository;
@Autowired
private UserService userService;
public Kelompok save(KelompokDTO request) {
try{
log.info("save new kelompok: {}", request);
log.info("search user id {}", request.getIdUser());
User user = userService.findById(request.getIdUser());
Kelompok kelompok = new Kelompok();
**kelompok.setUser(user);**
kelompok.setNik(request.getNik());
return kelompok;
} catch (Exception e) {
log.error("Get an error by executing create new kelompok, Error : {}",e.getMessage());
throw new RuntimeException(e.getMessage(), e);
}
}
Here is my User Service
@Slf4j
@Service
@Transactional
public class UserService {
@Autowired
private UserRepository userRepository;
public User findById(Long id) {
try {
log.info("Get user detail");
User user = userRepository.findById(id)
.orElseThrow(() -> new Exception("USER ID " + id + " NOT FOUND"));
return user;
} catch (Exception e) {
log.error("Get an error by get user detail, Error : {}",e.getMessage());
throw new RuntimeException(e.getMessage(), e);
}
}
}
I try to test it by doing this
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes=KelompokService.class)
public class KelompokServiceTest {
private final EasyRandom EASY_RANDOM = new EasyRandom();
private Long id;
private List<Kelompok> kelompoks;
private Kelompok kelompok;
private KelompokDTO kelompokDTO;
@Autowired
KelompokService kelompokService;
@MockBean
private UserService userService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
id = EASY_RANDOM.nextObject(Long.class);
kelompoks = EASY_RANDOM.objects(Kelompok.class, 2)
.collect(Collectors.toList());
kelompokDTO = EASY_RANDOM.nextObject(KelompokDTO.class);
kelompok= EASY_RANDOM.nextObject(Kelompok.class);
}
@Test
void testSave_Success() {
User user =EASY_RANDOM.nextObject(User.class);
when(userService.findById(kelompokDTO.getIdUser()))
.thenReturn(user);
kelompok.setUser(user);
kelompok.setNik(kelompokDTO.getNik());
when(kelompokRepository.save(kelompok))
.thenReturn(kelompok);
var result = kelompokService.save(kelompokDTO);
assertEquals(kelompok, result);
} }
But then I got error like this
java.lang.StackOverflowError at java.base/sun.util.locale.provider.TimeZoneNameUtility.retrieveDisplayNamesImpl(Unknown Source) at java.base/sun.util.locale.provider.TimeZoneNameUtility.retrieveDisplayName(Unknown Source) at java.base/java.util.TimeZone.getDisplayName(Unknown Source) at java.base/java.util.Date.toString(Unknown Source) at java.base/java.lang.String.valueOf(Unknown Source) at java.base/java.lang.StringBuilder.append(Unknown Source) at com.example.demo.entity.User.toString(User.java:25) at java.base/java.lang.String.valueOf(Unknown Source) at java.base/java.lang.StringBuilder.append(Unknown Source) at com.example.demo.entity.Kelompok.toString(Kelompok.java:22)