Mockito嘲笑本地最终课程,但在Jenkins中失败
我为静态方法编写了一些单元测试。静态方法只接受一个参数。参数的类型是最终类。在代码方面:
public class Utility {
public static Optional<String> getName(Customer customer) {
// method's body.
}
}
public final class Customer {
// class definition
}
因此,对于该类,我创建了一个测试类,其中我为此方法编写了测试。单元测试框架是TestNG,使用的模拟库是 。因此,典型的测试具有以下结构:Utility
UtilityTests
getName
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: Can not mock/spy class com.packagename.Customer Mockito can no mock/spy,因为 : - final class
我试过了什么?
为了找到解决方案,我搜索了一下,但我没有成功。我在这里指出,我不能改变这是最后一堂课的事实。除此之外,如果可能的话,我希望根本不改变它的设计(例如,创建一个接口,它将保存我想模拟的方法,并声明Customer类实现了该接口,正如Jose在他的评论中正确指出的那样)。我尝试过的事情是在mockito-final中提到的第二个选项。尽管这解决了问题,但它:(阻止了其他一些单元测试,这些测试无法以任何明显的方式修复。Customer
问题
所以这里有两个问题:
- 这首先是如何实现的?测试不应该在本地和 Jenkins 中都失败吗?
- 如何根据我上面提到的约束来解决这个问题?
提前感谢您的任何帮助。