정적 메소드에 대한 단위 테스트를 작성했습니다. 정적 메소드는 하나의 인수 만 사용합니다. 인수의 유형은 최종 클래스입니다. 코드 측면에서 :
public class Utility {
public static Optional<String> getName(Customer customer) {
// method's body.
}
}
public final class Customer {
// class definition
}
그래서위한 Utility
클래스 I는 테스트 클래스 생성 한 UtilityTests
, 나는이 방법에 대한 테스트를 쓴 한을 getName
. 단위 테스트 프레임 워크는 TestNG 이며 사용되는 조롱 라이브러리는 Mockito
입니다. 따라서 일반적인 테스트의 구조는 다음과 같습니다.
public class UtilityTests {
@Test
public void getNameTest() {
// Arrange
Customer customerMock = Mockito.mock(Customer.class);
Mockito.when(...).thenReturn(...);
// Act
Optional<String> name = Utility.getName(customerMock);
// Assert
Assert.assertTrue(...);
}
}
무엇이 문제입니까?
테스트는 IntelliJ 내에서 로컬로 성공적으로 실행되는 반면 Jenkins에서는 실패합니다 (원격 지사에서 코드를 푸시하면 빌드가 트리거되고 단위 테스트가 끝납니다). 오류 메시지는 다음과 같습니다.
org.mockito.exceptions.base.MockitoException : 클래스 com.packagename을 조롱 / 스파이 할 수 없습니다. 고객 Mockito는 다음과 같은 이유로 조롱 / 스파이 할 수 없습니다 :-final class
내가 무엇을 시도 했습니까?
솔루션을 찾기 위해 조금 검색했지만 만들지 않았습니다. 나는 내가 점에 유의 하지 사실 변경할 수 Customer
A는 최종 클래스를. 이 외에도, 나는 디자인 을 전혀 바꾸지 않기를 원합니다 (예 : 인터페이스 만들기, 고객 클래스가 모의하고 싶은 메소드를 보유하고 싶어합니다. 논평). 내가 시도한 것은 mockito-final 에서 언급 한 두 번째 옵션 입니다. 이로 인해 문제가 해결되었다는 사실에도 불구하고 다른 단위 테스트를 제동합니다.
질문
여기 내가 가진 두 가지 질문이 있습니다.
- 처음에는 어떻게 가능합니까? 테스트가 로컬과 Jenkins에서 모두 실패하지 않아야합니까?
- 위에서 언급 한 제약 조건에 따라 어떻게 해결할 수 있습니까?
도움을 주셔서 감사합니다.
Customer
논리가 있습니까 아니면 바보 같은 데이터 클래스입니까? 게터와 세터가있는 필드가 많으면 인스턴스화 할 수 있습니다.
enable final
구성이 작업 공간에서 작동하지만 실행Jenkins
시이 파일을 찾을 수 없다는 것입니다.Jenkins
파일을 찾는 위치 와 실제로 있는지 여부를 확인하십시오 .