How to test service that use other service return as field?

Viewed 44

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)

0 Answers
Related