java - 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() ) );
}
解决方案
永远不要使用 @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() );
}
}
推荐阅读
- electron - 识别初级电子窗口
- facebook - 用于获取喜欢计数的 Facebook API
- firebase - 在使用 firebase 动态链接时,我是否需要为电子商务应用中的每个产品手动创建动态链接?
- javascript - 当我在数据表中添加按钮(打印)时,lengthChange 不显示
- dart - text justify 不能与 RichText 一起正常工作
- python - 双击将 txt 文件添加到自定义 PyQt 编辑器
- android - 预期为 BEGIN_OBJECT,但在第 1 行第 1 列路径为 STRING - Laravel 到改造 2
- php - 下单成功后更改第 n 个订单的用户角色
- html - 如何从后端 Django MarkdownX 渲染到 Vue.js 前端的 html?
- google-chrome - 添加到主屏幕迷你信息栏未在某些设备上显示