【问题标题】:Multiple levels of @Mock and @InjectMocks多个级别的@Mock 和@InjectMocks
【发布时间】:2011-06-09 23:27:16
【问题描述】:

所以我知道在 Mockito 中,@InjectMocks 会通过 @Mock 的注解注入任何它可以注入的东西,但是如何处理这种情况呢?

@Mock
private MockObject1 mockObject1;

@Mock
private MockObject2 mockObject2;

@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();

假设 MockObject2 有一个 MockObject1 类型的属性,而 SystemUnderTest 有一个 MockObject2 类型的属性。我想将 mockObject1 注入到 mockObject2 中,并将 mockObject2 注入到 systemUnderTest 中。

这可以通过注释实现吗?

【问题讨论】:

  • 您似乎没有使用 Spring,否则使用“@MockBean”而不是“@Mock”来模拟 bean(与模拟级别无关)非常容易。跨度>

标签: java mockito


【解决方案1】:

由于我在这里没有得到任何回复,所以我在 Mockito 论坛上提问。这是讨论的链接:https://groups.google.com/d/topic/mockito/hWwcI5UHFi0/discussion

总结答案,从技术上讲,这会破坏嘲笑的目的。您实际上应该只模拟 SystemUnderTest 类所需的对象。在本身就是模拟的对象中模拟事物是毫无意义的。

如果你真的想这样做,@spy 可以提供帮助

【讨论】:

  • 是的,它不适合使用模拟的 unit 测试,但是这个特性(一直向下注入依赖项)对于 集成 非常有用i> 测试。我目前正在为我自己的模拟工具包 JMockit 开发它。
【解决方案2】:

可以将@Spy 与@InjectMocks 结合使用。对于您的示例,它将是:

@Spy
private MockObject1 mockObject1 = new MockObject1 ();

@Spy @InjectMocks //if MockObject2 has a MockObject1, then it will be injected here.
private MockObject2 mockObject2 = new MockObject2 ();

@InjectMocks
private SystemUnderTest systemUnderTest;

【讨论】:

【解决方案3】:

我发现的其他解决方案是使用 java sintax 代替注解来注入 @Spy 对象。

@Spy
private MockObject1 mockObject1 = new MockObject1 ();

@InjectMocks //if MockObject2 has a MockObject1, then it will be injected here.
private MockObject2 mockObject2 = spy(MockObject2.class);

@InjectMocks
private SystemUnderTest systemUnderTest;

【讨论】:

    【解决方案4】:

    这对我有用:

    private MockObject1 mockObject1 = mock(MockObject1.class);
    
    @Spy
    private RealObject2 realObject = new RealObject2(mockObject1);
    
    @InjectMocks
    private SystemUnderTest systemUnderTest = new SystemUnderTest();
    

    【讨论】:

    • 但这并不是真正的注入,因为您只是使用构造函数将 MockObject1 发送到 MockObject2。
    【解决方案5】:

    这是我的解决方案:

    @ExtendWith(SpringExtension.class)
    class DocumentServiceTestMock {
    
    //2nd Level Dependency
    CustomerFacade customerFacade = Mockito.mock(CustomerFacade.class);
    
    //Direct Dependency
    @Spy
    PostCreateHelper postCreateHelper = new PostCreateHelper(customerFacade);
    
    //SUT
    @InjectMocks
    DocumentService documentService;
    
    @BeforeEach
    void setUp() {
            given(customerFacade.getString()).willReturn("customerFacade_MOCKED");
    }
    
    @Test
    void test() {
         String documentAsResource = documentService.getDocumentAsResource(ExportType.WORD);
    }
    //----------
    @Service
    public class DocumentService {
       final PostCreateHelper postCreateHelper;
    
    @Component
    public class PostCreateHelper {
       final CustomerFacade customerFacade;
    
    @Service
    public class CustomerFacade {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      相关资源
      最近更新 更多