我已经为静态方法编写了一些单元测试。静态方法仅接受一个参数。参数的类型是最终类。在代码方面:
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寻找文件,以及它是否实际存在。