Mokcito не издевается над слоем DAO - PullRequest
1 голос
/ 08 ноября 2019

У меня есть приложение Spring MVC. У него есть Контроллер, Сервис и Дао. Я хотел бы протестировать только Контроллер и Сервис путем Mocking слоя DAO с помощью Mockito.

Мой класс контроллера:

@Controller
@RequestMapping(value="/audit")
public class AuditController {

   @Autowired
   AuditService auditService;

   ...
}

Мой класс обслуживания:

@Service
public class AuditService {

   @Autowired
   AuditDao auditDao;

   ....
}

Мой тестовый класс:

@RunWith(SptringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/dispatcher-servlet.xml", "spring-context.xml"})
@WebAppConfiguration
public class AuditControllerTest {

   private MockMvc mockMvc;

   @Mock
   AuditDao auditDao;

   @Autowired
   private WebApplicationContext webApplicationContext;

   @Before
   public void setUp() {
       MockitAnnotations.initMocks(this);
       mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
   }


  @Test
  public void testGetAudit() {

      Mockito.when(auditDao.getAudit(Mockito.any(Long.class))).thenReturn(new Audit(1L));
      mockMvc.perform(get("/audit/{id}", "1")).andExpect(status().isOk());
  }
}

ЗАДАЧА: ВыполняетЗвоните нормально, пройдя через автонастроенный контроллер и Сервис. Однако из Службы вызовы DAO направляются в реальный DAO, а не в Mocked DAO.

  1. Я понимаю, что DAO автоматически подключен к реальному Dao, однако я не уверен, какзамените этот Dao на Mock из теста.

  2. Сохранение Dao в контроллере и использование @InjectMock для контроллера работает нормально, но я хочу сохранить Dao в сервисе ипротестируйте только контроллер и службу, но смоделируйте только Dao.

  3. Я подозреваю, что эта проблема связана с контекстами (контекст веб-приложения и контекст MockMvc), однако я неконечно, как решить.

Любая помощь будет принята с благодарностью. Заранее спасибо.

1 Ответ

1 голос
/ 08 ноября 2019

Во-первых, я бы предложил исключить Autowired поля и сделать так, чтобы класс явно отображал их зависимости через зависимости конструктора

Класс контроллера:

@Controller
@RequestMapping(value="/audit")
public class AuditController {
    private final AuditService auditService;

    @Autowired
    public AuditController(AuditService auditService) {
        this.auditService = auditService
    }

    //...
}

Класс обслуживания:

@Service
public class AuditService {            
    private final AuditDao auditDao;

    @Autowired
    public AuditService(AuditDao auditDao) {
        this.auditDao = auditDao;
    }

    //....
}

Я думал о чем-то вроде

@RunWith(SptringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/dispatcher-servlet.xml", "spring-context.xml"})
@WebAppConfiguration
public class AuditControllerTest {

    private MockMvc mockMvc;

    @Mock
    AuditDao auditDao;

    @InjectMock
    AuditService auditService;

    @Before
    public void setUp() {
        MockitAnnotations.initMocks(this);
        AuditController controller = new AuditController (auditService);
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    }

    @Test
    public void testGetAudit() {

      Mockito.when(auditDao.getAudit(Mockito.any(Long.class))).thenReturn(new Audit(1L));
      mockMvc.perform(get("/audit/{id}", "1")).andExpect(status().isOk());
    }
}

Но я не уверен, будет ли оно вести себя так, как ожидалось при выполнении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...