当前位置: 首页 > 知识库问答 >
问题:

Mockito不能注射mocks

巢宏富
2023-03-14

我正在使用Mockito,并试图将一个Mock CustomFileHandler注入到我的Rejercciiodao类中以进行测试。问题是,我的测试没有抛出任何异常,但它没有注入我的模拟对象,原始的@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);

        ...

    }

顺便说一句,实体按预期工作,接口正确链接到实际实体,我已经测试过了。我该如何解决这个问题?

共有2个答案

狄元魁
2023-03-14

你试图把它和单元测试结合起来。

1)如果您使用Spring Boot:

@MockBean
private ICustomFileHandler customFileHandler;

@Autowired
private IREjercicioDAO rEjercicioDAO;

就这样。。

2)不使用Spring Boot:

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;

模拟被注入,你可以在测试中随意设置

东郭俊楠
2023-03-14

这里有一个否定的答案。我不能给出更多,因为我真的很抱歉看到这么多人使用这个依赖于反射的尴尬API,而您可以通过显式设置依赖关系为类的读者做非常清楚的事情。

问题是,我的测试不会抛出任何异常,但它不会注入我的模拟对象

这并不奇怪。这种注入模拟的方式即使没有成功注入,也会保持安静。从InjectMocksjavadoc(重点不是我的!):

Mockito将尝试仅通过构造函数注入、setter注入或按顺序和如下所述的属性注入来注入模拟。如果以下任何策略失败,则Mockito不会报告失败;即您必须自己提供依赖项。

虽然Mockito不报告失败,但我真的不鼓励使用这个API。

关于你的实际问题,看看:

@Autowired
@InjectMocks
private IREjercicioDAO rEjercicioDAO;

可以使用Spring和Mockito注释对字段进行注释。你对他们的处理顺序感到满意吗?它们来自两个不同的库。我不认为它永远不会起作用(幸运和随机存在),但你真的认为它很强大吗?

为了实现您的需求,您可以编写这样的东西,它分两个明确的步骤来完成工作:
-objects实例化:模拟依赖项并注入spring依赖项
-relationship set:在模拟依赖项和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);         
    }
 }
 类似资料:
  • 我在Spring服务中使用推土机。如何使用JUnit和Mockito将注入到已测试的服务中? 我的java类(如果简化)看起来像: 使用JUnit 4 Mockito Hamcrest的测试类如下所示: 问题在于模拟的Dozer实例没有按预期映射对象——默认情况下,Mockito存根返回空或空对象。如果我从测试中删除注释,它会抛出NPE!

  • 本文向大家介绍mockito 使用Mockito批注,包括了mockito 使用Mockito批注的使用技巧和注意事项,需要的朋友参考一下 示例 我们要测试的类是: 它的合作者是: 在我们的测试中,我们想打破依赖关系Collaborator及其错误,因此我们将模拟Collaborator。使用@Mock注释是为每个测试创建不同的模拟实例的便捷方法: Mockito将尝试按以下顺序解决依赖项注入:

  • 我正在使用Mockito测试我的spring项目,但是似乎无法将一个模拟服务注入到另一个spring服务(bean)中。 下面是我想测试的spring服务: 下面是我要嘲弄的服务: 我的测试代码在这里: 但结果是 似乎CreateMailboxService没有得到模拟的UserInfoService而是使用了spring的autowired Bean。为什么我的不能工作?

  • 我是新手,我想在我的课上注入上下文和网络(使用改型)。 这是我到目前为止的代码: 这是我的组件: 但是我如何在应用程序类中使用注入器,这是没有意义的

  • 我试图在JavaSE中建立一个非常简单的weld实现。 我有扩展类: 然后,我有一个简单的类,我想注入: 最后,我想把它注入课堂: 结果是: 我希望在构造Test()时注入简单类,并调用postconstruct方法,该方法应输出预期文本。 我到底做错了什么?

  • 我试图模拟一个公共类,但是当这样做时,Mockito抛出一个异常。 我想嘲弄的班级:https://github.com/scribejava/scribejava/blob/master/scribejava-core/src/main/java/com/github/scribejava/core/builder/ServiceBuilder.java 测试代码: 完整堆栈跟踪: