Mockito 无法注入模拟
Mockito can't inject mocks
我正在使用 Mockito,我正在尝试将 Mock CustomFileHandler 注入我的 REjercicioDAO class 以进行测试。问题是,我的测试没有抛出异常,但它没有注入我的模拟对象,原始的 @Autowired CustomFileHandler 没有被替换。这是我的代码:
@Repository
public class REjercicioDAO extends ARHibernateDAO < REjercicio > implements IREjercicioDAO {
@Autowired
public ICustomFileHandler customFileHandler;
...
}
这是我的测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION)
public class REjercicioDAOTest extends ATest {
@Mock private ICustomFileHandler customFileHandler;
@Autowired
@InjectMocks
private IREjercicioDAO rEjercicioDAO;
@Before
public void before () {
MockitoAnnotations.initMocks(this);
...
}
顺便说一句,实体按预期工作,接口正确链接到实际实体,我已经测试过了。我该如何解决这个问题?
这里没有答案。我不能提供更多,因为我真的很遗憾看到这么多人使用这种笨拙的 API 依赖于反射,而你可以通过显式设置依赖关系来为 class 的读者做一些非常清楚的事情。
The thing is, my test throws no exceptions, but it doesn't inject my
mock object
不足为奇。即使没有注入成功,这种注入模拟的方式也会保持安静。 From the InjectMocks
javadoc(重点不是我的!):
Mockito will try to inject mocks only either by constructor injection,
setter injection, or property injection in order and as described
below. If any of the following strategy fail, then Mockito won't
report failure; i.e. you will have to provide dependencies yourself.
虽然 Mockito 不会报告失败,但我真的不鼓励使用这个 API。
关于你的实际问题,看看那个:
@Autowired
@InjectMocks
private IREjercicioDAO rEjercicioDAO;
您使用 Spring 和 Mockito 注释对字段进行注释。您对他们的处理顺序感到满意吗?这些来自两个不同的库。我没有说它永远不会起作用(存在运气和随机性),但您真的认为它很可靠吗?
为了达到您的要求,您可以编写类似的东西,分两步完成:
- 对象实例化:模拟依赖并注入 spring 依赖
- 关系集:模拟依赖和 spring 依赖
之间
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION)
public class REjercicioDAOTest extends ATest {
@Mock
private ICustomFileHandler customFileHandler;
@Autowired
private IREjercicioDAO rEjercicioDAO;
@Before
public void before () {
MockitoAnnotations.initMocks(this);
// Set explicitly the fileHandler dependency
rEjercicioDAO.setFileHandler(customFileHandler);
}
}
您正在尝试将 IT 与单元测试混合。
1) 如果你使用的是Spring Boot:
@MockBean
private ICustomFileHandler customFileHandler;
@Autowired
private IREjercicioDAO rEjercicioDAO;
就是这样..
2) 未使用 Spring 引导:
public class TestConfig{
@Bean
@Primary
public ICustomFileHandler customFileHandler(){
return Mockito.mock(ICustomFileHandler.class);
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION, classes=TestConfig.class)
public class REjercicioDAOTest extends ATest {
@Autowired
private ICustomFileHandler customFileHandlerMock;
@Autowired
private IREjercicioDAO rEjercicioDAO;
模拟被注入,您可以根据需要在测试中设置它
我正在使用 Mockito,我正在尝试将 Mock CustomFileHandler 注入我的 REjercicioDAO class 以进行测试。问题是,我的测试没有抛出异常,但它没有注入我的模拟对象,原始的 @Autowired CustomFileHandler 没有被替换。这是我的代码:
@Repository
public class REjercicioDAO extends ARHibernateDAO < REjercicio > implements IREjercicioDAO {
@Autowired
public ICustomFileHandler customFileHandler;
...
}
这是我的测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION)
public class REjercicioDAOTest extends ATest {
@Mock private ICustomFileHandler customFileHandler;
@Autowired
@InjectMocks
private IREjercicioDAO rEjercicioDAO;
@Before
public void before () {
MockitoAnnotations.initMocks(this);
...
}
顺便说一句,实体按预期工作,接口正确链接到实际实体,我已经测试过了。我该如何解决这个问题?
这里没有答案。我不能提供更多,因为我真的很遗憾看到这么多人使用这种笨拙的 API 依赖于反射,而你可以通过显式设置依赖关系来为 class 的读者做一些非常清楚的事情。
The thing is, my test throws no exceptions, but it doesn't inject my mock object
不足为奇。即使没有注入成功,这种注入模拟的方式也会保持安静。 From the InjectMocks
javadoc(重点不是我的!):
Mockito will try to inject mocks only either by constructor injection, setter injection, or property injection in order and as described below. If any of the following strategy fail, then Mockito won't report failure; i.e. you will have to provide dependencies yourself.
虽然 Mockito 不会报告失败,但我真的不鼓励使用这个 API。
关于你的实际问题,看看那个:
@Autowired
@InjectMocks
private IREjercicioDAO rEjercicioDAO;
您使用 Spring 和 Mockito 注释对字段进行注释。您对他们的处理顺序感到满意吗?这些来自两个不同的库。我没有说它永远不会起作用(存在运气和随机性),但您真的认为它很可靠吗?
为了达到您的要求,您可以编写类似的东西,分两步完成:
- 对象实例化:模拟依赖并注入 spring 依赖
- 关系集:模拟依赖和 spring 依赖
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION)
public class REjercicioDAOTest extends ATest {
@Mock
private ICustomFileHandler customFileHandler;
@Autowired
private IREjercicioDAO rEjercicioDAO;
@Before
public void before () {
MockitoAnnotations.initMocks(this);
// Set explicitly the fileHandler dependency
rEjercicioDAO.setFileHandler(customFileHandler);
}
}
您正在尝试将 IT 与单元测试混合。
1) 如果你使用的是Spring Boot:
@MockBean
private ICustomFileHandler customFileHandler;
@Autowired
private IREjercicioDAO rEjercicioDAO;
就是这样..
2) 未使用 Spring 引导:
public class TestConfig{
@Bean
@Primary
public ICustomFileHandler customFileHandler(){
return Mockito.mock(ICustomFileHandler.class);
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION, classes=TestConfig.class)
public class REjercicioDAOTest extends ATest {
@Autowired
private ICustomFileHandler customFileHandlerMock;
@Autowired
private IREjercicioDAO rEjercicioDAO;
模拟被注入,您可以根据需要在测试中设置它