最近,我阅读并使用了一些示例,如下面链接的GitHub Repo中所示,它用于扩展基本的对象。我试图为ApiError.java类编写一些测试,特别是#addValidationError
基本的问题是,我还没有找到一种方法来使方法链接来返回值。我现在的测试看起来是这样的..。
@Test
public void addValidationErrors() {
ApiError apiError = new ApiError(HttpStatus.OK);
ConstraintViolation mockViolation = Mockito.mock(ConstraintViolation.class, Mockito.RETURNS_DEEP_STUBS);
Mockito.when(mockViolation.getRootBeanClass().getSimpleName()).thenReturn("MyBeanName");
...此时,测试将在调用NullPointerException方法的行上使用一个Mockito.when。我尝试过不同的运行器类(Mockito、JUnit4甚至PowerMock),以及各种注释组合,比如@PrepareForTest和在测试之外在@Mock下声明mockViolation。
发布于 2017-10-23 23:22:19
您的语法是正确的,但是这里您的具体问题是getRootBeanClass返回一个Class,而Mockito不能模拟最终的类。在幕后,当您请求模拟一个类时,Mockito生成一个子类,该子类(有效地)覆盖所有方法并将它们重定向到Mockito控件。这种覆盖机制将导致您在模拟final方法以及像java.lang.Class这样的final类时遇到困难。
虽然您可以使用PowerMock完成这一任务,但这是不可取的,就像2011年的Johan来自powermock@googlegroups.com的帖子那样:
我不认为有可能模拟类,因为这会使很多PowerMock内部的东西都搞砸了。如果您设置了getClass= true,那么您可以如何模拟对象的“MockGateway.MOCK_GET_CLASS_METHOD ()”方法。 不过,我强烈建议sic不要模仿类或getClass方法。试着用其他方法来验证它。
因为您只关心如何使getSimpleName返回一个可预测的值,所以可以考虑创建一个新的类("MyBean")并设置getRootBeanClass()来返回它。在接口上模拟返回值将非常容易,并且您将得到与您想要使用的相同类型的简单名称返回值。
https://stackoverflow.com/questions/46899506
复制相似问题