我有一个在Java 7下工作的测试类。一旦迁移到Java 11,测试就失败了。当我调试时,我看到注入的模拟为空。我认为某些@Mock注释也不正确。我可以摆脱注入模拟,并添加请求并在setUp()中进行模拟,该模拟可以正常工作,但是随后测试运行的是Java 7版本没有的代码,但它失败了。很难解释。
我可以做些什么来使@Mock和@InjectMocks注释与Java 11一起使用吗?
您可以看到一些模拟为空(开关,权限等)
这是pom条目
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.5</version>
<optional>true</optional>
<scope>test</scope>
</dependency>
这里是测试班
@RunWith(MockitoJUnitRunner.class)
public class ByVehicleIdRequestTest {
private final String vehicleId = "1GD31WCG0H0000000";
@Mock
private VehicleIdValidator validator;
private Locale locale = Locale.US;
@Mock
private AdditionalInfo additionalInfo;
@Mock
private Permissions permissions;
@Mock
private Switches switches;
@Mock
private Map<String, String> aftermarketDescriptions;
@Mock
private EnhancedStringMatchingSettings enhancedStringMatchingSettings;
@Mock
DataAccessProvider<DataAccess.ByCountry, DataAccess> dataProvider;
@Mock
ActivityMonitor activityMonitor;
@InjectMocks
private ByVehicleIdRequest request = new ByVehicleIdRequest(locale, additionalInfo, permissions, switches, vehicleId, aftermarketDescriptions,
enhancedStringMatchingSettings);
@InjectMocks
private ByVehicleIdRequest vehicleIdRequest = new ByVehicleIdRequest(locale, additionalInfo, permissions, switches, vehicleId,
aftermarketDescriptions, enhancedStringMatchingSettings, true);
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testValidate() {
boolean hasNoCriticalError = false;
boolean includeOnlyOEMBuildDataDecode = true;
when(switches.includeOnlyOEMBuildDataDecode()).thenReturn(includeOnlyOEMBuildDataDecode);
ValidationResult validationResult = mock(ValidationResult.class);
when(validator.validate(same(vehicleId), any(DataAccessProvider.class), same(locale), any(VinMatchFinder.class), anyBoolean())).thenReturn(validationResult);
List<StatusDetail> loggableCodes = mock(List.class);
when(validationResult.getLoggableCodes()).thenReturn(loggableCodes);
doNothing().when(activityMonitor).addDetails(anyList());
VinMatchFinder.StylesFound stylesFound = mock(VinMatchFinder.StylesFound.class);
when(validationResult.getStylesFound()).thenReturn(stylesFound);
when(validationResult.hasNoCriticalErrors()).thenReturn(hasNoCriticalError);
assertEquals(hasNoCriticalError, request.isValid(activityMonitor, dataProvider, Collections.<String>emptyList()));
assertEquals(vehicleId, request.getVehicleId());
assertSame(stylesFound, request.getStylesFound());
}
不确定在Java7中为什么这对您有用,但是您显然以错误的方式使用了@InjectMocks
。
@InjectMocks
private ByVehicleIdRequest request = new ByVehicleIdRequest(
locale,
additionalInfo,
permissions,
switches,
vehicleId,
aftermarketDescriptions,
enhancedStringMatchingSettings);
如果使用Mockito运行器(或JUnit5中的扩展名,则不应自己初始化该字段:
@InjectMocks
private ByVehicleIdRequest request;
如MockitoJUnitRunner documentation中所述:
模拟在每种测试方法之前初始化。
如果在request
对象的字段初始化中使用模拟值,则会将尚未初始化的值传递给构造函数,因此会观察到空值。