我已经为静态方法编写了一些单元测试。静态方法仅接受一个参数。参数的类型是最终类。在代码方面:
public class Utility {
public static Optional<String> getName(Customer customer) {
// method's body.
}
}
public final class Customer {
// class definition
}
因此,对于Utility
该类,我创建了一个测试类,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无法模拟/间谍,因为:-最终类
我尝试了什么?
我搜索了一下,以找到解决方案,但没有成功。我在这里指出,我不容许改变的事实,Customer
是一个最终的类。除此之外,我想尽可能不更改其设计(例如,创建一个接口,该接口将容纳我要模拟的方法并声明Customer类实现了该接口,正如Jose在其著作中正确指出的那样。评论)。我尝试过的事情是在模仿最终中提到的第二种选择。尽管事实上这解决了问题,但它制动了其他一些单元测试:(,无法以任何明显的方式解决。
问题
所以这是我有两个问题:
- 首先这怎么可能?考试是否应该在本地和詹金斯都失败?
- 如何根据我上面提到的约束来解决此问题?
在此先感谢您的帮助。
Customer
有任何逻辑,还是仅仅是愚蠢的数据类?如果只是一堆带有getter和setter的字段,那么您可以实例化它。
enable final
配置可在您的工作空间中工作,但在Jenkins
其上运行时找不到该文件。检查哪里Jenkins
寻找文件,以及它是否实际存在。