2017-04-04 5 views
0

자바에서 리플렉션을 사용하여 필자는 사용 가능하게하려는 클래스 이름의 arraylist를 반복하고, 인스턴스를 생성 한 다음 각각에 'parse (String)'이라는 공통 이름의 메소드를 호출하는 코드를 작성했습니다.Java - 동적으로 인스턴스화 된 메서드가 런타임에 호출되는지 확인하는 방법?

for (String parser : enabledParses) 
{ 
    Class<?> parserClass = Class.forname(String.format"%s.%s", parserDirectoryPath, parser)); 
    Method parseMethod = parserClass.getMethod("parse", String.class); 
    Object parserObj = null; 

    switch (parser) 
    { 
     case "parser1" : 
      parserObj = parserClass.getConstructor(ConfigWrapper.class, Alerter.class).newInstance(config, alerter); 
      break; 
    ... 
    ... 
    ... 
    } 
    parseMethod.invoke(pluginObj, stringToParse); 

테스트 할 때 사용 가능한 파서마다 parse() 메서드가 호출되었는지 확인하려면 어떻게합니까?

감사합니다!

+0

유일한 방법은 확인하기 위해, 또는 당신이를 확인했다 경우 나, 알고하자 전화의 결과. –

+0

모욕을 부상에 추가하려면 parse()가 void 메서드입니다. 당신의 도움을 주셔서 감사합니다. – notfreshprince

답변

0

일부 메서드가 호출되었다는 것을 확인하려면 Mockito를 사용하고 Mockito.verify (....)를 사용할 수 있습니다. 그러나 구현이 너무 크기 때문에 테스트를 크게 수행하는 것이 좋습니다. 더 나은 분해를 시도하십시오. 그것을 더 간단한 방법 인 더 많은 방법으로 나눕니다. 예를 들어 :

List<MyInterface> loadAndCreateInstances(File ...) 

void callParse(List<MyInterface> instances) {} 

그런 다음 Mockito를 사용하고 조롱/spyed 객체의 목록 (Collections.singletonList (myMock))를 만들 수 있습니다. 확인 :

Mockito.verify(myMock,times(1)).parse(any()) 

나는 그들이이라고 당신은 그들이 불렸다 기록하는 이러한 방법에 코드를 추가하는 경우입니다된다면 모든 :-)

+0

감사합니다. 매우 유용합니다! – notfreshprince