在MockitoJUnitRunner下运行测试时,DAO未进行自动装配

时间:2015-01-16 14:59:55

标签: java spring mockito

我需要测试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> {
}

1 个答案:

答案 0 :(得分:2)

除非您明确测试DAO,否则您应该嘲笑它。您可以监视您的服务,然后告诉mockito在调用其get方法时注入模拟的dao。

doReturn(mockDoa).when(parserService).getRecordDao()

如果你坚持要在那里获得真正的dao,那么你应该在测试中启动spring应用程序上下文,让spring管理你所有的bean,而不是自己初始化它们。 autowired无法工作的唯一原因是因为servce是手动初始化的,并且不是任何弹簧环境的一部分,因此springntnt知道它,并且不知道它需要dao!