这是我的测试类
@RunWith(MockitoJUnitRunner.class)
public class ServiceTest extends Service{
@Mock
EntityManager eman = Mockito.mock(EntityManager.class);
@Mock
Query query;
@InjectMocks
private Service service;
private static final String NAME = "name";
@Before
public void setUp() {
this.service=new Service();
}
@Test
public void firstMethodTest() {
Query query = mock(Query.class);
when(
eman.createNamedQuery(NAME)).thenReturn(query);
when
( query.setParameter("name", Type)).thenReturn(query);
when (query.getSingleResult()).thenReturn(type);
**service.getAllMethod(1, "string");**
assertSame(/*Something to compare */);
}
}
这是我的服务类方法
public getAllMethod(int ID, String string)
{
Query query=em
.createNamedQuery("name");
**query.setParameter("string", Type);**
type= query.getSingleResult();
}
当从Mocked对象调用 service.getAllMethod(1,“String”)时,我在 query.setParameter(“name”,Type)获取NPE,因为我认为查询仍然是NULL。请假设我的服务工作正常。 在此先感谢
调试时我检查服务类中查询查询的值。它的值为null。可以找出解决此问题的方法。
答案 0 :(得分:1)
您在每次测试前都在重新创建服务。因此,Mockito注入模拟的Service
已经丢失了。
摆脱setUp
方法,而是声明这样的服务:
@InjectMocks
private Service service = new Service();
还有其他一些问题。例如EntityManager
Mockito.mock
不是必需的,测试类不应该延伸Service
,@Mock Query
未被使用。
这是一个粗略的模板:
@RunWith(MockitoJUnitRunner.class)
public class TestA {
@Mock
EntityManager eman;
@InjectMocks
private Service service = new Service();
@Test
public void firstMethodTest() {
Query query = Mockito.mock(Query.class);
Mockito.when(eman.createNamedQuery(NAME)).thenReturn(query);
service.getAllMethod(1, "string");
}
}
假设服务类似于:
public class Service {
@Autowired
EntityManager entityManager;
public void getAllMethod(int i, String s) {
Query q = entityManager.createNamedQuery("name");
... q isn't null here for me
}
}