首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mockito / Junit5 org.opentest4j.AssertionFailedError for getter()

Mockito / Junit5 org.opentest4j.AssertionFailedError for getter()
EN

Stack Overflow用户
提问于 2018-12-06 12:46:08
回答 1查看 17.3K关注 0票数 2

如果我在下面的方法中进行了JUnit Mockito测试,它将在org.opentest4j.AssertionFailedError: expected: null中失败。但是在使用verify()和Assertions.assertNotNull()之前的Mockito-(参数-)测试是可以的。我做错了什么或者我不明白什么?这是我的密码:

JUnit5 5/模拟测试:

代码语言:javascript
复制
@Mock
private MyentityAServiceImpl myentityAServiceImplmock;
@Captor
private ArgumentCaptor<MyentityA> myentityAArgument;
@Mock
private MyentityBdao myentityBdaomock;
@Mock
private MyentityB myentityBmock;
@Mock
private Logger loggermock;
@InjectMocks
private MyentityBServiceImpl teServiceImpl;

@Test
public void setMyentityAOfTeIfNullByLanr17() {
    myentityBmock.setLanr7( "1234567" );
    final MyentityA myentityA = new MyentityA();
    mockito.when( myentityAServiceImplmock.findMyentityAByLanr17( myentityBmock.getLanr7() ) ).thenReturn( myentityA );
    mockito.when( myentityBdaomock.save( myentityBmock ) ).thenReturn( myentityBmock );
    myentityBmock = teServiceImpl.setMyentityAOfTeIfNullByLanr17( myentityBmock );
    mockito.verify( myentityBmock ).setMyentityA( myentityAArgument.capture() );
    Assertions.assertNotNull( myentityAArgument );
    Assertions.assertNotNull( myentityBmock.getMyentityA() );  // --> org.opentest4j.AssertionFailedError: expected: not <null>
}

测试方法:

代码语言:javascript
复制
  public MyentityB setMyentityAOfTeIfNullByLanr17( final MyentityB entity ) {
    MyentityA myentityA = entity.getMyentityA();
    if ( myentityA != null ) {
        return entity;
    }
    final String lanr17 = entity.getLanr7();
    myentityA = myentityAServiceImpl.findMyentityAByLanr17( lanr17 );
    if ( myentityA != null ) {
        entity.setMyentityA( myentityA );
        entity.setModuser( "root" );
        return myentityBdao.save( entity );
    }
    return entity;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-06 13:41:24

对不起,您的测试代码太复杂了。

它非常精细地描述了在被测试方法中操作的对象的调用流程。

此外,您还会嘲笑许多事情:依赖关系、测试中方法的参数。

最后,将被测试方法的返回赋给引用模拟参数的变量。这让事情变得很不清楚。

测试必须是直截了当的,是可以理解的,但事实并非如此。

我花了大约5百万才明白错误的原因。对于这样简单的代码来说,这是太多了。

此断言失败:

代码语言:javascript
复制
Assertions.assertNotNull( myentityBmock.getMyentityA() );  // --> org.opentest4j.AssertionFailedError: expected: not <null>

这是因为在经过测试的方法中,getMynEntityA()只能是null,因为myentityBmock是一个模拟,并且像这里一样设置字段不会对实际字段和相关的getter行为产生影响:

代码语言:javascript
复制
if ( myentityA != null ) {
    entity.setMyentityA( myentityA ); // here you invoke a mocked method.
    entity.setModuser( "root" );
    return myentityBdao.save( entity );
}

实际上,使用主要描述测试方法调用流程的测试方式,这就足够了:

代码语言:javascript
复制
mockito.verify( myentityBmock ).setMyentityA( myentityAArgument.capture() );

因为您不能测试setMyentityA()的副作用。

但实际上,我强烈建议您在不模拟测试方法的参数的情况下对您的方法进行单元测试。

它看起来可能是:

代码语言:javascript
复制
@Test
public void setMyentityAOfTeIfNullByLanr17() {
    MyentityB entityB = new MyentityB(...) ;
    entityB.setLanr7( "1234567" );
    final MyentityA myentityA = new MyentityA();
    mockito.when( myentityAServiceImplmock.findMyentityAByLanr17( entityB.getLanr7() ) ).thenReturn( myentityA );
    mockito.when( myentityBdaomock.save(entityB) ).thenReturn(entityB);

    // action
    MyentityB entityActualB = teServiceImpl.setMyentityAOfTeIfNullByLanr17(entityB);

    // Perform content/logic assertion and no flow assertion :
    Assertions.assertEquals(myEntityA, entityActualB.getMyEntityA());
    Assertions.assertEquals("root", entityActualB.getModuser());
}

没有经过测试的代码,但它会帮助您理解我的意图。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53651797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档