Boots
Boots

Reputation: 63

initialise a service for mocking in java with mockito and junit 5

I'm trying to learn some integration testing whilst creating a project to make a game database, and have got a class that calls a service within it's methods

    public DigitalGame findDigitalGameByTitleAndPlatform(DigitalGame digitalGame){
        if(digitalGame == null){
            return null;
        }
        return GamesJPAService.iDigitalGameRepository.findDigitalGameByTitleAndPlatform(digitalGame.getTitle(), digitalGame.getPlatform());
    }

The GamesJpaService as shown below, is initialised as an @Service when the project is started as an application. But is not initialised within the test class, no matter whether it is autowired,newed up, or any other method I have spotted to try and initialise it. for example using the @InjectMocks annotation

@Service
public class GamesJPAService implements IJpaServices {
    public static IDigitalGameRepository iDigitalGameRepository;

    @Autowired
    private IDigitalGameRepository iDigitalGameRepo;


    @PostConstruct
    public void init(){
        iDigitalGameRepository = this.iDigitalGameRepo;
    }
}

The IDigitalGameRepository that it calls looks like:

public interface IDigitalGameRepository extends JpaRepository<DigitalGame, String> {
    DigitalGame findDigitalGameByTitleAndPlatform(String title, Platform platform);
}

I have ommited some methods from the proceeding code. My test class also looks like (at the moment)

@DisplayName("Digital Games Dao Test")
class DigitalGamesDaoTest {

    Set<Peripheral> compatiblePeriphs = new HashSet<>();
    Set<SupportedLanguages> supportedLanguages = new HashSet<>();
    List<Mods> mods = new ArrayList<>();
    List<DLC> dlc = new ArrayList<>();
    DigitalGame olliolli = new DigitalGame("olliolli", "", "sports", "olliolli", new ReleaseDate(), new Platform(), compatiblePeriphs, new Developer(), new Publisher(), new Region(), supportedLanguages, new NoneEnglish(), mods, dlc, "", new SpecialEdition(), true, new Platform());

    private IDigitalGamesDao digitalGamesDao;

    @Mock
    GamesJPAService gamesJpaService;


    @BeforeEach
    void setUp() {
        digitalGamesDao = new DigitalGamesDao();
    }

   @Test
    @DisplayName("insertDigitalGame should return false when digital game already in database")
    public void insertDigitalGameShouldReturnFalseWhenDigitalGameInDatabase(){
        EntityManager mockEntityManager = mock(EntityManager.class);

        when(GamesJPAService.iDigitalGameRepository.findDigitalGameByTitleAndPlatform(olliolli.getTitle(), olliolli.getPlatform())).thenReturn(olliolli);
        doReturn(olliolli).when(digitalGamesDao.findDigitalGameByTitleAndPlatform(olliolli));
        when(digitalGamesDao.findDigitalGameByTitleAndPlatform(olliolli)).thenReturn(olliolli);

        when(mockEntityManager.merge(olliolli)).thenReturn(null);
        assertFalse(digitalGamesDao.insertDigitalGame(olliolli));
    }

    @Test
    @DisplayName("insertDigitalGame should return true when digital game added to database")
    public void insertDigitalGameShouldReturnTrueWhenDigitalGameNotInDatabase(){

    }

and I am getting a null pointer exception,

java.lang.NullPointerException: Cannot invoke "com.me.gamedatabasebackend.dao.gamesJPA.IDigitalGameRepository.findDigitalGameByTitleAndPlatform(String, com.me.gamedatabasebackend.model.platform.Platform)" because "com.me.gamedatabasebackend.dao.gamesJPA.GamesJPAService.iDigitalGameRepository" is null

As GamesJPAService is not being tested I need to know how to skip it and just return the value. So I need help to find a way for either, doing a component scan from my test class, or importing the GamesJPAService into it in a useable manner.

Upvotes: 0

Views: 1075

Answers (1)

Mr_Thorynque
Mr_Thorynque

Reputation: 2012

You need to annotate your test class with some think like that to make injection works

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = { SpringTestConfiguration.class })
DisplayName("Digital Games Dao Test")
class DigitalGamesDaoTest {
...

But you have a nullpointer because GamesJPAService.iDigitalGameRepository is null. That's a static property and the instance of GamesJPAService is a mock so the init() method is never call.

Upvotes: 1

Related Questions