首页 > 解决方案 > JUnit 和 Mockito 在模拟时返回 null

问题描述

我对 JUnit 和 Mockito 完全陌生。我在测试我的ServiceImpl课程时遇到了问题。当调试时指针进入ServiceImpl类内部时,该方法会抛出nullPointerException. 谁能告诉我如何在“getDetails”方法中调用该方法。“varNumber”始终返回 null。

DetailsUtilsClientImpl 类

  private final DetailsUtils detailsUtils;

  @Autowired
  Utils utils

 @Autowired
 public DetailsUtilsClientImpl( DetailsUtils 
 detailsUtils) {
    this.detailsUtils= detailsUtils;
}

    public Details getDetails( String var1 ) {
       String varNumber = utils.smgContent( var1 ); 
       Details getDetailsDocument =
       detailsRepository.findById( varNumber ).orElse( null );
    return null;
}

测试班

@Autowired
DetailsUtils detailsUtils;

@Autowired
DetailsUtilsClient detailsUtilsClient;

@Autowired
Utils utils

@Autowired
Pageable pageable;

 @Before
public void setUp() {
    detailsUtils = mock( DetailsUtils.class );
    utils = mock( Utils.class );
    pageable = mock( Pageable.class );
}

@Test
public void getCarDocument() {

    List<Entity.Type> listPre = new ArrayList<Entity.Type>();
    Entity.Type preTest = new Entity.Type();
    preTest.setDesc( Mob.AUTOMOB );
    preTest.setDet( Car.CAR );
    listPre.add( preTest );

    Entity c1 = new Entity();
    c1.setId( "accountID" );
    c1.setCarNo( "gfsd2134gh" );
    c1.setCarDetail( "accountDet" );
    c1.setEntity( listPre );

    detailsUtilsClient client =
        new DetailsUtilsClientImpl( detailsUtils );


    Optional<Entity> client1 = Optional.of( c1 );
    when( detailsUtils.findById( c1.getCarNo() ) ).thenReturn( client1 );
    Entity c2 = client.getEntity ( "gfsd2134gh" );
    assertThat( c2.getCarNo(), equalTo( c1.getCarNo() ) );
   }

标签: javaspring-bootjunitmockito

解决方案


永远不要使用 @Autowired 来模拟依赖,而是使用 @Mock 来模拟依赖。@InjectMocks 将创建对象并注入所有模拟的依赖项。在单元测试中,我们基本上关注的是方法的工作和依赖关系之间的交互。 http://www.startwithjava.com/best-practices-for-unit-testing/

public class Test{

    @Mock
    DetailsUtils detailsUtils;

    @InjectMocks
    DetailsUtilsClient detailsUtilsClient;

    @Mock
    Utils utils;

    @Mock
    Pageable pageable;


     @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void getCarDocument() {
        //GIven
        List<Entity.Type> listPre = new ArrayList<Entity.Type>();
        Entity.Type preTest = new Entity.Type();
        preTest.setDesc( Mob.AUTOMOB );
        preTest.setDet( Car.CAR );
        listPre.add( preTest );

        Entity c1 = new Entity();
        c1.setId( "accountID" );
        c1.setCarNo( "gfsd2134gh" );
        c1.setCarDetail( "accountDet" );
        c1.setEntity( listPre );


        Optional<Entity> client1 = Optional.of( c1 );
        when( detailsUtils.findById( c1.getCarNo() ) ).thenReturn( client1 );

        //When
        Entity c2 = detailsUtilsClient.getEntity ( "gfsd2134gh" );

        //Then
        assertThat( c2.getCarNo(), equalTo( c1.getCarNo() ) );
        //use behavior test using Mockito.verify(dependency,times(noOfInteraction)).methodName(arg)
        Mockit.verify(detailsUtils,Mockito.times(1))..findById( c1.getCarNo() );
       }

    }

推荐阅读