Как проверить внутренний вызов метода с помощью Powermock? - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь использовать PowerMockito для проверки метода сохранения путем проверки внутреннего вызова метода audit () . Этот внутренний вызов выполняется объектом auditor , который создается в методе init () класса. Поскольку это не введено, я не буду в состоянии издеваться над этим непосредственно. Когда я использовал Mockito для проверки, он всегда говорил: «У нас было нулевое взаимодействие с макетом». Вопрос: Как именно я тестирую функцию сохранения? Пожалуйста, помогите!

public class DaoImpl implements Dao{
private Auditor auditor;

@InjectValue
private ObjectLoader loader;

@InjectValue
private ConfigurationProvider confProvider;

@PostConstruct
public void init() {
    //Mock this object instantiation and verify audit is called once
    auditor = new SyncAuditor(confProvider.getClientConfiguration(), new EventRegProvider());
}

@Override
public void save(final AuditEvt auditEvt) {
  final AuditedEvent auditedEvent = builder.build();
  auditor.audit(auditedEvent); 
 }

Тест:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ DaoImplTest.class })
@PowerMockIgnore("javax.management.*")
public class DaoImplTest extends PowerMockito {

@InjectMocks
private DaoImpl dataAccess;

@Mock
private SynchAuditor auditorMock;
 @Before
public void setUp() throws Exception {
    loader = ObjectLoader.init("JUNIT");
    loader.bind(ConfigurationProvider.class, configurationProviderMock);
    dataAccess = loader.newInstance(DaoImpl.class);
}

@After
public void tearDown() {
    loader.release(dataAccess);
    ConnectionMgr.disconnect("JUNIT");
}

@Test
public void testSaveAuditEvent() throws Exception { 
     PowerMockito.whenNew(SynchAuditor.class).
     withArguments(Matchers.any(ClientConfiguration.class), Matchers.any(EventRegProvider.class)).thenReturn(this.auditorMock);
     final AuditEvent event = AuditEvent.from(null, "principal", UUID.randomUUID().toString(), "randomText",
            new AuditEvtDefn((long) 522, "234242", "234242fdgd", true), SUCCESS, null, new GregorianCalendar());
     dataAccess.save(event);
     Mockito.verify(auditorMock, times(1)).audit(Matchers.any(AuditedEvent.class));
}

Даже PowerMockito.verifyNew говорит, что взаимодействие было нулевым PowerMockito.verifyNew(SynchronousAuditor.class,times(1)).withArguments(Matchers.any(AuditorClientConfiguration.class),Matchers.any(EventRegistrationProvider.class));

1 Ответ

0 голосов
/ 11 сентября 2018

Итак, я понял, что Java-отражение поможет в такой ситуации. Вам нужно будет ухватиться за реальный объект, а затем установить на него макетируемый объект.

final Field privateAuditorField = DaoImpl.class.getDeclaredField("auditor");
privateAuditorField.setAccessible(true);
privateAuditorField.set(dataAccess, auditorMock);

Теперь проверка будет успешно выполнена.

Mockito.verify(auditorMock, Mockito.times(1)).audit(Matchers.any(AuditedEvent.class));

...