有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Mockito/Junit5 org。opentest4j。getter()的断言失败错误

如果我用下面的方法进行JUnit Mockito测试,它会在org中失败。opentest4j。断言失败错误:应为:非空。但是Mockito-(参数)测试之前使用了verify()和断言。assertNotNull()可以。我做错了什么或我不明白什么?这是我的代码:

JUnit5/模拟测试:

@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>
}

测试方法:

  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;
}

共 (1) 个答案

  1. # 1 楼答案

    抱歉,你的测试代码太复杂了
    它过于精细地描述了在测试方法中操作的对象的调用流
    此外,您还模拟了很多东西:依赖项、测试方法的参数
    最后,将被测试方法的返回分配给引用模拟参数的变量。这让事情变得非常不清楚

    考试必须是直白易懂的,而事实并非如此
    我花了大约500万英镑才明白错误的原因。对于这样一个简单的代码来说,这是非常重要的

    此断言失败:

    Assertions.assertNotNull( myentityBmock.getMyentityA() );  //  > org.opentest4j.AssertionFailedError: expected: not <null>
    

    这是因为在测试的方法中getMynEntityA()只能是null,因为myentityBmock是一个模拟的,在这里设置字段对实际字段和相关的getter行为没有影响:

    if ( myentityA != null ) {
        entity.setMyentityA( myentityA ); // here you invoke a mocked method.
        entity.setModuser( "root" );
        return myentityBdao.save( entity );
    }
    

    事实上,您的测试方法主要描述被测试方法的调用流,这就足够了:

    mockito.verify( myentityBmock ).setMyentityA( myentityAArgument.capture() );
    

    因为你无法测试setMyentityA()的副作用

    但实际上,我强烈建议您在不模仿已测试方法的参数的情况下对方法进行单元测试
    它可能看起来像:

    @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());
    }
    

    根本没有经过测试的代码,但它应该可以帮助您理解我的意图