是否可以在注入其他模拟时给出模拟作为参数?
Is it possible give a mock as argument while injecting other mocks?
我正在使用 JUnit5。
我有以下情况:
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class SomeClassTest {
// needs to be mocked but not injected
@Mock
private EntityManager entityManager;
// needs to be mocked and injected
@Mock
private SomeDao someDao;
@InjectMocks
private SomeClass someClass = new someClass(entityManager);
public class SomeClass{
EntityManager entityManager;
public SomeClass(EntityManager entityManager) {
if (entityManager == null) {
throw new NullpointerException("Manager is null");
} else {
this.entityManager = entityManager;
}
问题是:
- 需要模拟的 EntityManager 对象来创建 class 我想测试
- 必须注入 SomeClass 中需要的 SomeDao
- 我得到一个空指针,因为当我将模拟对象作为参数提供给构造函数时,模拟对象似乎没有被创建
有人知道如何解决这个问题吗?我可以创建一个无参数构造函数,但这会给我一个构造函数,我只需要测试它不是 'clean'.
您应该将 SomeDao someDao 作为参数添加到 SomeClass 构造函数中,然后您将能够使用 @Mock
通过测试来操作它
查看此答案 () Mockito 使用 3 种方式注入模拟。
第一个是在构造函数中注入它,如果有一个接受参数的构造函数的话。
因此,我像@nesmeyana 提到的那样更改了我的构造函数:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import javax.persistence.EntityManager;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
public class SomeClassTest {
@Mock
private EntityManager mockEntityManager;
@Mock
private SomeDao mockSomeDao;
@InjectMocks
private SomeClass someClass;
@Test
public void test() {
when(mockSomeDao.duck()).thenReturn(10);
assertEquals(10, someClass.bla());
}
}
public class SomeClass{
EntityManager entityManager;
SomeDao someDao;
public SomeClass(EntityManager entityManager, SomeDao someDao) {
if (entityManager == null) {
throw new NullpointerException("Manager is null");
} else {
this.entityManager = entityManager;
this.someDao = someDao;
}
public class SomeDao{
int x = 5;
public SomeDao(int x) {
this.x = x;
}
public int duck() {
return x;
}
}
但是由于我必须更改我的代码才能测试我的 类,所以我不得不重新考虑我的代码编写!
我和所有读到这篇文章的人,应该避免硬依赖并使用 CI(依赖注入)来轻松测试他们的代码。
我正在使用 JUnit5。
我有以下情况:
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class SomeClassTest {
// needs to be mocked but not injected
@Mock
private EntityManager entityManager;
// needs to be mocked and injected
@Mock
private SomeDao someDao;
@InjectMocks
private SomeClass someClass = new someClass(entityManager);
public class SomeClass{
EntityManager entityManager;
public SomeClass(EntityManager entityManager) {
if (entityManager == null) {
throw new NullpointerException("Manager is null");
} else {
this.entityManager = entityManager;
}
问题是:
- 需要模拟的 EntityManager 对象来创建 class 我想测试
- 必须注入 SomeClass 中需要的 SomeDao
- 我得到一个空指针,因为当我将模拟对象作为参数提供给构造函数时,模拟对象似乎没有被创建
有人知道如何解决这个问题吗?我可以创建一个无参数构造函数,但这会给我一个构造函数,我只需要测试它不是 'clean'.
您应该将 SomeDao someDao 作为参数添加到 SomeClass 构造函数中,然后您将能够使用 @Mock
通过测试来操作它查看此答案 (
因此,我像@nesmeyana 提到的那样更改了我的构造函数:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import javax.persistence.EntityManager;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
public class SomeClassTest {
@Mock
private EntityManager mockEntityManager;
@Mock
private SomeDao mockSomeDao;
@InjectMocks
private SomeClass someClass;
@Test
public void test() {
when(mockSomeDao.duck()).thenReturn(10);
assertEquals(10, someClass.bla());
}
}
public class SomeClass{
EntityManager entityManager;
SomeDao someDao;
public SomeClass(EntityManager entityManager, SomeDao someDao) {
if (entityManager == null) {
throw new NullpointerException("Manager is null");
} else {
this.entityManager = entityManager;
this.someDao = someDao;
}
public class SomeDao{
int x = 5;
public SomeDao(int x) {
this.x = x;
}
public int duck() {
return x;
}
}
但是由于我必须更改我的代码才能测试我的 类,所以我不得不重新考虑我的代码编写! 我和所有读到这篇文章的人,应该避免硬依赖并使用 CI(依赖注入)来轻松测试他们的代码。