[英]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.