我对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() ) );
}
答案 0 :(得分:2)
从不使用@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() );
}
}
答案 1 :(得分:1)
通常NPE是由于测试用例的配置错误而引起的,而您已经省略了最“有意义的”部分-测试用例的配置:
如果使用@Autowired
,则有可能尝试使用spring(否则就没有意义)。但是在这种情况下,应该使用一个特殊的SpringRunner来运行测试,该启动器将启动应用程序上下文,初始化所有bean,然后将它们自动连接到测试字段。
至少应为@RunWith(SpringRunner.class)
在这种情况下,它不再是单元测试,而更像是集成/组件测试。
或者,如果您根本不想使用Spring,则必须有人实例化这些类。这是常规的单元测试。
默认情况下,JUnit作为工具无法实例化任何内容。
因此,您必须对此“指导” JUnit。由于您在此处使用Mockito,可能应该使用规则或运行器(指导junit-Mockito集成):
规则方法:
class ExampleTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
}
跑步者方法:
@RunWith(MockitoJUnitRunner.class)
public class ExampleTest {
}