Mockito模拟本地最终课程,但在詹金斯失败

问题描述 投票:5回答:2

我已经为静态方法编写了一些单元测试。静态方法仅接受一个参数。参数的类型是最终类。在代码方面:

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更改Customerfinal类的事实。除此之外,我想尽可能地改变它的设计(例如,创建一个接口,该接口将保留我要模拟的方法并声明Customer类实现了该接口,正如Jose在其评论中正确指出的那样)。我尝试的是mockito-final中提到的第二个选项。尽管事实解决了问题,但它制动了其他一些单元测试:(,无法以任何明显的方式解决。

问题

所以这是我有两个问题:

    首先怎么可能?考试是否应该在本地和詹金斯都失败?
  1. 如何根据我上面提到的约束来解决这个问题?
  • 谢谢您的帮助。
  • java unit-testing mockito testng
    2个回答
    0
    投票
    一种替代方法是使用“分类方法”模式。

      将方法从客户类中移到另一个类中,例如,CustomerSomething,例如/ CustomerFinances(或它的职责是什么。)>]
    1. 向客户添加构造函数。
    2. 现在您无需嘲笑Customer,只需模拟CustomerSomething类!如果它没有外部依赖项,您可能也不需要模拟。
    3. 这是一个有关该主题的好博客:https://simpleprogrammer.com/back-to-basics-mock-eliminating-patterns/

    0
    投票
    首先怎么可能?测试是否应该在本地和詹金斯考试中均未通过?
    © www.soinside.com 2019 - 2024. All rights reserved.