运行 在 MockitoJUnitRunner 下进行测试时,DAO 未被自动装配
DAO is not being Autowired while running tests under MockitoJUnitRunner
我需要测试 parserService。不幸的是,它表明 RecordDao 对象应该是自动装配的,但它不是,它仍然是 null
而 运行 测试。如何解决?
ParserControllerTest
@RunWith(MockitoJUnitRunner.class)
public class ParserControllerTest {
@InjectMocks
private ParserService parserService;
private ParserController parserController;
@Before
public void setUp() throws Exception {
parserController = new ParserController(parserService);
}
@Test
public void parseFileToRecordEntity(){
try {
InputStream is = new FileInputStream(new File("exampleLog.txt"));
List<Record> records = parserService.parse(IOUtils.toByteArray(is));
for(Record r: records){
System.out.println(r.toString());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务
@Service("parserService")
public class ParserService {
@Autowired
RecordDao recordDao;
public List<Record> parse(byte[] fileBytes) {
//....
if(!records.isEmpty()){
for(Record r: records){
recordDao.save(r);
}
}
return records;
}
}
RecordDao
import domain.Record;
import org.springframework.data.repository.CrudRepository;
public interface RecordDao extends CrudRepository<Record, Long> {
}
除非您明确测试您的 DAO,否则您可能应该模拟它。你可以监视你的服务,然后告诉 mockito 在你调用它的 get 方法时注入模拟的 dao。
doReturn(mockDoa).when(parserService).getRecordDao()
如果您坚持要在那里获取真正的 dao,那么您应该在测试中启动一个 spring 应用程序上下文并让 spring 管理您的所有 bean,而不是自己初始化它们. autowired 不工作的唯一原因是因为服务是手动初始化的并且不是任何 spring 上下文的一部分,因此 spring dosent 知道它,并且不知道它需要一个 dao!
我需要测试 parserService。不幸的是,它表明 RecordDao 对象应该是自动装配的,但它不是,它仍然是 null
而 运行 测试。如何解决?
ParserControllerTest
@RunWith(MockitoJUnitRunner.class)
public class ParserControllerTest {
@InjectMocks
private ParserService parserService;
private ParserController parserController;
@Before
public void setUp() throws Exception {
parserController = new ParserController(parserService);
}
@Test
public void parseFileToRecordEntity(){
try {
InputStream is = new FileInputStream(new File("exampleLog.txt"));
List<Record> records = parserService.parse(IOUtils.toByteArray(is));
for(Record r: records){
System.out.println(r.toString());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务
@Service("parserService")
public class ParserService {
@Autowired
RecordDao recordDao;
public List<Record> parse(byte[] fileBytes) {
//....
if(!records.isEmpty()){
for(Record r: records){
recordDao.save(r);
}
}
return records;
}
}
RecordDao
import domain.Record;
import org.springframework.data.repository.CrudRepository;
public interface RecordDao extends CrudRepository<Record, Long> {
}
除非您明确测试您的 DAO,否则您可能应该模拟它。你可以监视你的服务,然后告诉 mockito 在你调用它的 get 方法时注入模拟的 dao。
doReturn(mockDoa).when(parserService).getRecordDao()
如果您坚持要在那里获取真正的 dao,那么您应该在测试中启动一个 spring 应用程序上下文并让 spring 管理您的所有 bean,而不是自己初始化它们. autowired 不工作的唯一原因是因为服务是手动初始化的并且不是任何 spring 上下文的一部分,因此 spring dosent 知道它,并且不知道它需要一个 dao!