繁体   English   中英

多层次的@Mock 和@InjectMocks

[英]Multiple levels of @Mock and @InjectMocks

所以我明白在 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 中。

这可能带有注释吗?

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

总结一下这些答案,从技术上来说,这会破坏嘲弄的目的。 您应该只模拟SystemUnderTest类所需的对象。 在自己模拟的对象中嘲弄东西是没有意义的。

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

将@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;

我发现的其他解决方案是使用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;

这对我有用:

private MockObject1 mockObject1 = mock(MockObject1.class);

@Spy
private RealObject2 realObject = new RealObject2(mockObject1);

@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();

这是我的解决方案:

@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 {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM