2017-04-19 16 views
0

I can't fake an abstract class directly 및 구현 클래스를 알고 있기 때문에 구현 클래스에 가짜를 추가했습니다.jMockit Fake/MockUp 추상 메서드를 제거하는 방법?

@BeforeClass 
public static void fakeCurrentYear() { 
    // Mocking the abstract 'Calender' does not work, see: https://github.com/jmockit/jmockit1/issues/71 
    // So we use the implementing class 'GregorianCalendar'. 
    new MockUp<GregorianCalendar>() { 

     @Mock public int get(Invocation invocation, int field) { 
      return 2016; 
     } 
    }; 
} 

저는 JUnit 4.12와 Maven 3.x에서 jMockit v 1.31을 사용하고 있습니다.

테스트를 개별적으로 실행하면 모든 것이 정상입니다.

하지만 모든 테스트를 함께 실행하면 구현 클래스의 log4jlogger가 가짜 구현을 사용하기 때문에 다른 테스트가 실패합니다.

이전에 GregorianCalendar이 해당 메소드를 덮어 쓰지 않았기 때문에 이것이라고 생각합니다. 그러나, 나는 가짜가 testclass 후에 자동적으로 제거되었다고 생각했다! 이거 버그 야?

수동으로 제거 할 수 있습니까? 나는 정적 변수 yearMock = new MockUp<GregorianCalendar>() ...을 생성하고 @AfterClass 메서드에서 yearMock.tearDown()을 호출했지만 JMockit v1.25로 스테핑을 시도했지만 아무 것도 변경하지 않았다.

답변

0

나는 그때이 방법을 조롱 내 테스트에서 코드

private int currentYear4digits() { 
    return Calendar.getInstance().get(Calendar.YEAR); 
} 

의 단 하나의 선으로 테스트중인 클래스의 메소드를 만든 해결 방법을 사용했습니다.

@BeforeClass 
public static void fakeCurrentYear() { 
    new MockUp<MyClass>() { 

     @Mock 
     public int currentYear4digits() { 
      return 2016; 
     } 
    }; 
} 

그러나 이는 단지 일시적인 해결책 일뿐입니다. Calendar에 대한 호출이 여러 클래스에서 만들어지면 성 가시니다.