Spring Junit测试中显示Null的模拟类变量



我有一个名为StringCircularQueue的Spring@Service@Scope("prototype"(类,它有一个构造函数,其中名为queueName变量正在初始化,方法addElement如下所示。为了在类内对该方法进行单元测试,我使用JUnit Mockito来模拟RedisConnectionConfig,该方法正在addElement方法中使用。

调试测试时,addElement方法内的redisConnectionConfig变量显示为null。但是,如果我注释掉构造函数并运行它,redisConnectionConfig变量会显示Non-Null值。

使用构造函数时无法弄清楚问题出在哪里。任何建议都会有很大帮助。

@Service
@Scope("prototype")
public class StringCircularQueue {
@Autowired
private RedisConnectionConfig redisConnectionConfig;
private String queueName;
public StringCircularQueue(String queueName) {
this.queueName = queueName;
}

public Boolean addElement(String element) {
RedissonClient redisClient = redisConnectionConfig.getRedisClient();
// Some other business logic
}
} 
public class RedisCircularQueueTest {
@InjectMocks
RedisStringCircularQueue redisStringCircularQueue;

@Mock
private RedisConnectionConfig redisConnectionConfig;
@Mock
private RedissonClient redissonClient;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}

@Test
public void testAddElementToQueue() {
Mockito.when(redisConnectionConfig.getRedisClient()).thenReturn(redissonClient);
Boolean isAdded = redisStringCircularQueue.addElement("testString");
Assert.assertEquals(true, isAdded);
}
}

不要依赖字段注入,而是依赖StringCircularQueue中的构造函数注入,如下所示:

@Service
@Scope("prototype")
public class StringCircularQueue {
private RedisConnectionConfig redisConnectionConfig;
private String queueName;
public StringCircularQueue(RedisConnectionConfig redisConnectionConfig, String queueName) {
this.redisConnectionConfig = redisConnectionConfig;
this.queueName = queueName;
}

public Boolean addElement(String element) {
RedissonClient redisClient = redisConnectionConfig.getRedisClient();
// Some other business logic
}
} 

有了这个,你的测试就可以了。

当您有构造函数时,它是null的原因如下:Mockito将尝试仅通过构造函数注入、属性注入或setter注入按此顺序注入mock。如果使用构造函数成功创建了对象,那么Mockito就不会尝试其他策略,这就是为什么redisConnectionConfignull,因为它必须直接注入到属性本身中。当您注释掉构造函数时,Mockito将只拥有StringCircularQueue的默认无参数构造函数。由于这不会注入任何内容,Mockito尝试属性注入,因此这次您得到了一个非空的redisConnectionConfig。您可以在官方文档中阅读更多信息,网址为https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/InjectMocks.html.

最新更新