Reputation: 151
Hello i am new in Junit mockito
i am trying to write a unit test case but when i am run the test case i am getting null pointer exception.
Code Snip:
package com.dataguise.webservices;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.mockito.Mockito.*;
import com.dataguise.cache.CacheManager;
import com.dataguise.controller.CentralController;
import com.dataguise.webservices.beans.DgUserAuthorities;
class RestAPIsTest {
@InjectMocks
private CentralController controller;
@Mock
DgUserAuthorities dgUserAuthorities;
@Mock
private CacheManager cacheManager;
@BeforeEach
public void setup() {
when(this.cacheManager.getCache(anyString())).thenReturn(true);
MockitoAnnotations.initMocks(this);
}
@Test
void testSession() {
try {
dgUserAuthorities = controller.login("d", "d", "", false);
when(controller.login("d", "d", "", false)).thenReturn(dgUserAuthorities);
assertEquals(dgUserAuthorities, dgUserAuthorities);
} catch (Exception e) {
e.printStackTrace();
}
}
}
While the same method call in the rest api gives the appropriate result.
Upvotes: 0
Views: 3031
Reputation: 26084
There are 2 errors in your test
Error 1: Mixing JUnit4 and JUnit5 annotations
org.junit.jupiter.api.Test
is from JUnit 5org.junit.Before
is from JUnit 4Thus, your @Before method is never executed. Use org.junit.jupiter.api.BeforeEach
instead
Error 2: Using Spring annotations without Spring Extension
@Autowired
comes from Spring's DI framework. It will be injected only if you use Spring Injection/ runner
If you want MockitoAnnotations.initMocks(this);
to build object under test and inject all mocks, use @InjectMocks
Error 3: confusing way of initializing mocks
There are 2 ways to initialize your mocks:
Manually:
this.dgUserAuthorities = mock(DgUserAuthorities.class);
this.controller = new CentralController(this.dgUserAuthorities);
Using annotations
@InjectMocks
private CentralController controller;
@Mock
DgUserAuthorities dgUserAuthorities;
Annotations require a call to MockitoAnnotations.initMocks(this)
or using a Mockito Extension: @ExtendWith(MockitoExtension.class)
I strongly discourage you to mix the 2 approaches. Also, if you use annotations, do not initialize the fields yourself.
Upvotes: 3