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

使用MockitoJUnitRunner运行测试时无法验证断言

孔运良
2023-03-14

有没有办法在类上不使用@RunWith(MockitoJUnitRunner)注释来模拟存储库?

我有一个测试通过了,没有注释,但是失败了。没有它,我的回购测试就不起作用。这是第二十二条军规。

当我使用这个注释时,我的测试中的当()方法不再是存根行为,模拟什么也不做,尽管设置了断点,那些断点被击中(表明行/方法正在运行),验证(...,次(x))语句说模拟对象从未与该方法相互作用。我一直在想为什么使用@RunBy(MockitoJUnitRunner)注释会使Mockito最简单的部分不起作用。

我找不到任何线程询问这个,但也许有人知道更好的关键字使用。这听起来像是已知的问题吗?

这是我的测试:

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;

// toggling this below annotation is the source of grief.
//@RunWith(MockitoJUnitRunner.class)
public class LoadEditEntityChangeLogServiceImplTest {

    @InjectMocks
    private ServiceImpl serviceMock;

    @Mock
    private EditStepRepository editStepRepository;

    @Mock
    private EditMapper editMapper;

    @Before
    public void init() {
        initMocks(this);
    }


    @Test // when the RunWith is commented out, this passes. When it is not, the test fails the verify assert. 
    public void mapEditEntityFromAction_Test() {
        EditDTO editDTO = Mockito.mock(EditDTO.class);
        when(editDTO.getSysNum()).thenReturn((long)7334);

        EditEntity editEntity = new editEntity();
        editEntity.setSysNum(editDTO.getSysNum());

        when(editMapper.mapToEntity(eq(editDTO))).thenReturn(editEntity);

        editEntity response = serviceMock.mapEditEntityFromAction(editDTO);

        verify(loadEditMapper, times(1)).mapToEntity(eq(loadEventDTO));
        assertEquals(loadEventDTO.getSystemNumber(), response.getSystemNumber());
    }

    @Test // this will fail without the @RunWith as the mocked repo will be null and throws NullPointerException when used.
    public void updateConvertedEventSegment_Test() {
        EditEntity editEntity = new EditEntity();
        EditStepEntity editStepEntity = new EditStepEntity();
        editEntity.setEditStep(editStepEntity);

        doReturn(editStepEntity).when(editStepRepository).save(any());

        serviceMock.updateEditStep(editEntity);

        verify(editEntity, times(1)).getEditStep();
        verify(editStepRepository, times(1)).save(eq(editStepEntity));
    }
}

共有1个答案

南门棋
2023-03-14

你应该了解这个跑步者实际上做了什么:

基本上,它允许注入mock(由mockito用mockito.mock(…)编写)进入带有@Mock注释的测试字段。在问题中,由于您已经注释掉了跑步者,所有这些字段都将为空。

当你用@InjectMocks注释某件事时,它会将模拟注入到注释引用类型的对象的字段中。

这里还有一点需要澄清:MockitoAnnotations。initMocks(this)将与“runner”执行相同的操作,因此无需同时包含这两个部分(如果由于某种原因无法使用runner,例如必须使用另一个runner,则应使用initMocks

现在,你问:

有没有一种html" target="_blank">方法可以在类上没有@RunFor(MockitoJUnitRunner)注释的情况下模拟存储库?

答案是-是的,你可以,事实上你不必使用跑步者,有时它更方便。

所以,假设您真的使用了这个runner,真正的问题是“我的存储库不工作”到底是什么意思。这是否意味着服务中存在指向此存储库及其null的引用?

这是否意味着有一个模拟存储库,但是当你执行“测试下”的调用时,模拟是不同的?

您没有在代码中显示它,但我假设您有一些类似的:

public class ServiceImpl {
   private final EditStepRepository editStepRepository;

   public ServiceImpl(EditStepRepository editStepRepository) {
      this.editStepRepository = editStepRepository;
   }
   ...
}

但是如果是这样,一旦你创建了一个mock(实际上应该有一个mock注入到ServiceImpl类中(用调试器或其他东西检查一下),应该在存储库上指定期望,通常应该在测试:

Mockito.when(editStepRepository.doSomething(...)).thenReturn(...)

你没有放这些线,这就是为什么它不起作用。

但总的来说,由于这个问题包含了许多不确定的技术细节,像这样,我只能说其他的猜测。。。

 类似资料:
  • 问题内容: 我有一个基于Gradle的Java项目,现在我想使用PowerMock模拟一个私有方法。问题是我无法使用PowerMockRunner,因为添加注释时总是会收到以下异常。 错误: 这是我的测试依赖项: 完全为空(初始化错误)时,测试本身也会失败: 任何想法可能有什么问题吗?使用PowerMock的其他测试运行正常(没有一个使用PowerMockRunner)。 问候和感谢您的任何帮助!

  • 我遇到了无法使用Maven运行JUnit5测试的问题。在IDE中运行它们工作正常,但使用“mvn测试”会产生以下输出: 这是我的测试课程: pom: 我做了一些研究,我认为这可能与混合JUnit4和JUnit5特性有关,这导致maven surefire插件无法运行测试。然而,我找不到那些剩余的JUnit4特性可能在哪里。我将感谢任何帮助。

  • 我正在尝试使用空手道独立震击器执行测试。在整个项目中,我在查找文件时使用。 但是,当我试图从CLI执行测试时,会收到以下错误: 命令: 似乎我将不得不声明执行类路径,你能提供一些关于如何做到这一点的见解吗?我不确定我的问题是否与[空手道][独立]错误:无法找到或读取文件

  • 附加信息@Saifur我创建了一个单独的基类,在其中我初始化了驱动程序实例。我在@BeForeClass中调用这个实例,在@afterClass中调用driver.quit()。通过在testng.xml中提供两个不同的类,我试图运行这个实例。

  • 我正在尝试用Maven/Intellij运行spock测试。但是maven和intellij都没有接受测试类。它肯定会拾取类,但不会在类中执行任何测试。 2)Surefire插件配置正确,因为它会拾取文件进行测试 3)target/test-classs文件夹中生成的测试类 我需要帮助我在这里错过了什么。

  • 玩弄Mockito来实现我的服务的单元测试,但由于某种原因,我无法通过我的厚脑袋来实现这一点。我的考试通过了,但我不能确信我做得对。 下面是一个测试count()方法的示例。该方法只是将调用转发到它的存储库,我不想验证仅此而已,没有其他事情发生。这就是我得到的: 我的考试及格了,但我有一些问题。 > 我需要验证吗?我觉得我这样做是因为我想验证personRepository。实际上调用了count