运行 在 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!