我需要测试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> {
}
答案 0 :(得分:2)
除非您明确测试DAO,否则您应该嘲笑它。您可以监视您的服务,然后告诉mockito在调用其get方法时注入模拟的dao。
doReturn(mockDoa).when(parserService).getRecordDao()
如果你坚持要在那里获得真正的dao,那么你应该在测试中启动spring应用程序上下文,让spring管理你所有的bean,而不是自己初始化它们。 autowired无法工作的唯一原因是因为servce是手动初始化的,并且不是任何弹簧环境的一部分,因此springntnt知道它,并且不知道它需要dao!