Java JUnit和Mockito在模拟时返回null
我对JUnit和Mockito完全陌生。我在测试我的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
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