Java JUnit和Mockito在模拟时返回null

Java JUnit和Mockito在模拟时返回null,java,spring-boot,junit,mockito,Java,Spring Boot,Junit,Mockito,我对JUnit和Mockito完全陌生。我在测试我的serviceinpl类时遇到了问题。 调试时,当指针进入ServiceImpl类时,该方法抛出nullPointerException。 有人能告诉我如何在“getDetails”方法中调用该方法吗。“varNumber”始终返回null DetailsUtilsClientImpl类 private final DetailsUtils detailsUtils; @Autowired Utils utils @Autow

我对JUnit和Mockito完全陌生。我在测试我的
serviceinpl
类时遇到了问题。 调试时,当指针进入
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() ) );
   }
@Autowired
细节细节;
@自动连线
DetailsUtilsClient DetailsUtilsClient;
@自动连线
Utils Utils
@自动连线
可寻呼可寻呼;
@以前
公共作废设置(){
detailsUtils=mock(detailsUtils.class);
utils=mock(utils.class);
pageable=mock(pageable.class);
}
@试验
公共无效GetCardDocument(){
List listPre=new ArrayList();
Entity.Type预测试=新建Entity.Type();
预测试。setDesc(Mob.AUTOMOB);
预测试设置数据(Car.Car);
添加(预测试);
实体c1=新实体();
c1.setId(“账户ID”);
c1.setCarNo(“gfsd2134gh”);
c1.setCarDetail(“accountDet”);
c1.集合实体(listPre);
DetailsSutilsClient客户端=
新的DetailsUtilsClientImpl(detailsUtils);
可选客户端1=可选的(c1);
when(detailsUtils.findById(c1.getCarNo())。然后返回(client1);
实体c2=client.getEntity(“gfsd2134gh”);
断言(c2.getCarNo(),equalTo(c1.getCarNo());
}

不要使用@Autowired作为依赖项,而要使用@Mock作为要模拟的依赖项@InjectMock将创建对象并注入所有模拟的依赖项。 在单元测试中,我们基本上关心方法的工作和依赖关系之间的交互

公共类测试{
@嘲弄
细节细节;
@注射模拟
DetailsUtilsClient DetailsUtilsClient;
@嘲弄
Utils-Utils;
@嘲弄
可寻呼可寻呼;
@以前
公共作废设置(){
initMocks(this);
}
@试验
公共无效GetCardDocument(){
//给定
List listPre=new ArrayList();
Entity.Type预测试=新建Entity.Type();
预测试。setDesc(Mob.AUTOMOB);
预测试设置数据(Car.Car);
添加(预测试);
实体c1=新实体();
c1.setId(“账户ID”);
c1.setCarNo(“gfsd2134gh”);
c1.setCarDetail(“accountDet”);
c1.集合实体(listPre);
可选客户端1=可选的(c1);
when(detailsUtils.findById(c1.getCarNo())。然后返回(client1);
//什么时候
实体c2=detailsUtilsClient.getEntity(“gfsd2134gh”);
//然后
断言(c2.getCarNo(),equalTo(c1.getCarNo());
//使用Mockito.verify(依赖项、时间(noOfInteraction)).methodName(arg)使用行为测试
验证(detailsUtils,Mockito.times(1))…findById(c1.getCarNo());
}
}

不要使用@Autowired作为依赖项,而要使用@Mock作为要模拟的依赖项@InjectMock将创建对象并注入所有模拟的依赖项。 在单元测试中,我们基本上关心方法的工作和依赖关系之间的交互

公共类测试{
@嘲弄
细节细节;
@注射模拟
DetailsUtilsClient DetailsUtilsClient;
@嘲弄
Utils-Utils;
@嘲弄
可寻呼可寻呼;
@以前
公共作废设置(){
initMocks(this);
}
@试验
公共无效GetCardDocument(){
//给定
List listPre=new ArrayList();
Entity.Type预测试=新建Entity.Type();
预测试。setDesc(Mob.AUTOMOB);
预测试设置数据(Car.Car);
添加(预测试);
实体c1=新实体();
c1.setId(“账户ID”);
c1.setCarNo(“gfsd2134gh”);
c1.setCarDetail(“accountDet”);
c1.集合实体(listPre);
可选客户端1=可选的(c1);
when(detailsUtils.findById(c1.getCarNo())。然后返回(client1);
//什么时候
实体c2=detailsUtilsClient.getEntity(“gfsd2134gh”);
//然后
断言(c2.getCarNo(),equalTo(c1.getCarNo());
//使用Mockito.verify(依赖项、时间(noOfInteraction)).methodName(arg)使用行为测试
验证(detailsUtils,Mockito.times(1))…findById(c1.getCarNo());
}
}

通常NPE的发生是由于测试用例的错误配置,并且您忽略了最“有意义”的部分-测试用例配置:

如果您使用的是
@Autowired
,那么您可能会尝试使用spring(否则就没有意义了)。但是在这种情况下,测试应该使用一个特殊的spring runner运行,它将启动应用程序上下文,初始化所有bean,然后将它们自动连接到测试字段

至少应该是
@RunWith(SpringRunner.class)

在这种情况下,它不再是一个单元测试,而是更像一个集成/组件测试

或者,如果您根本不想使用Spring,那么必须有人实例化这些类。这是一个常规的单元测试

默认情况下,JUnit作为工具不能实例化任何东西

因此,您必须“指导”JUnit这一点。因为您在这里使用的是Mockito,所以可能应该使用规则或运行程序(说明junit-Mockito集成):

规则方法:

 class ExampleTest {
   @Rule
   public MockitoRule rule = MockitoJUnit.rule();
 }
 @RunWith(MockitoJUnitRunner.class)
 public class ExampleTest {
 }
跑道进近:

 class ExampleTest {
   @Rule
   public MockitoRule rule = MockitoJUnit.rule();
 }
 @RunWith(MockitoJUnitRunner.class)
 public class ExampleTest {
 }

通常NPE是由于测试用例的错误配置而发生的,您忽略了最“有意义”的部分-测试用例配置:

如果您使用的是
@Autowired
,那么您可能会尝试使用spring(否则就没有意义了)。但是在这种情况下,测试应该使用一个特殊的spring runner运行,它将启动应用程序上下文,初始化所有bean,然后将它们自动连接到测试字段

至少应该是
@RunWith(SpringRunner.class)

在这种情况下,它不是一个u