[@ injectmock和@mock活动在迁移到Java 11时不起作用

问题描述 投票:0回答:1

我有一个在Java 7下工作的测试类。一旦迁移到Java 11,测试就失败了。当我调试时,我看到注入的模拟为空。我认为某些@Mock注释也不正确。我可以摆脱注入模拟,并添加请求并在setUp()中进行模拟,该模拟可以正常工作,但是随后测试运行的是Java 7版本没有的代码,但它失败了。很难解释。

我可以做些什么来使@Mock和@InjectMocks注释与Java 11一起使用吗?

您可以看到一些模拟为空(开关,权限等)

enter image description here

这是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());
}
unit-testing mockito java-11
1个回答
0
投票

不确定在Java7中为什么这对您有用,但是您显然以错误的方式使用了@InjectMocks

@InjectMocks
private ByVehicleIdRequest request = new ByVehicleIdRequest(
   locale,
   additionalInfo,
   permissions,
   switches,
   vehicleId, 
   aftermarketDescriptions, 
   enhancedStringMatchingSettings);

如果使用Mockito运行器(或JUnit5中的扩展名,则不应自己初始化该字段:

@InjectMocks
private ByVehicleIdRequest request;

MockitoJUnitRunner documentation中所述:

模拟在每种测试方法之前初始化。

如果在request对象的字段初始化中使用模拟值,则会将尚未初始化的值传递给构造函数,因此会观察到空值。

© www.soinside.com 2019 - 2024. All rights reserved.