我已经为静态方法编写了一些单元测试。静态方法仅接受一个参数。参数的类型是最终类。在代码方面:
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.Customer Mockito无法模拟/间谍,因为:-期末班
我尝试了什么?
我进行了一些搜索,以找到解决方案,但没有成功。我在这里注意到,我被允许[[not更改Customer
是final类的事实。除此之外,我想尽可能地改变它的设计(例如,创建一个接口,该接口将保留我要模拟的方法并声明Customer类实现了该接口,正如Jose在其评论中正确指出的那样)。我尝试的是mockito-final中提到的第二个选项。尽管事实解决了问题,但它制动了其他一些单元测试:(,无法以任何明显的方式解决。
问题
所以这是我有两个问题:首先怎么可能?测试是否应该在本地和詹金斯考试中均未通过?