Unit-testing, spring mvc-controller mit mockito
ich bin mit mockito und junit und unit-test mit spring mvc
mein flow code:
Service Layer
-> Model Layer
-> Controller Layer
war ich erfolgreich testen den Controller gegen die Modell-Ebene mit dem code:
@RunWith(MockitoJUnitRunner.class)
public class HashLinkerControllerTest {
private static final Logger LOGGER = Logger
.getLogger(HashLinkerControllerTest.class);
@Mock
private HashLinkerModel modelMock;
@InjectMocks
private HashLinkerController controller;
private MockMvc mockMvc;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
@Test
public void update() throws Exception {
int date = 123;
String hashToCheck = "asdfasdfasdfasdfas";
HashLinker first = this.createHashLinker(hashToCheck, "some name",
"some des", "some data", date);
when(modelMock.update(first)).then(returnsFirstArg());
mockMvc.perform(
put("/api/hashService/" + hashToCheck)
.contentType(TestUtil.APPLICATION_JSON_UTF8)
.content(
TestUtil.convertObjectToJsonBytesWithSettersOnly(first))
.accept(TestUtil.APPLICATION_JSON_UTF8))
.andExpect(status().isOk())
.andExpect(
content().contentType(TestUtil.APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$.hash", is(hashToCheck)))
.andExpect(jsonPath("$.description", is("some des")))
.andExpect(jsonPath("$.name", is("some name")));
verify(modelMock, times(1)).update(first);
verifyNoMoreInteractions(modelMock);
}
aber jetzt bin ich auf der Suche nach einer Möglichkeit zum testen der 3-Ebenen-Struktur. ich.e testen Sie den service gegen den controller . ich kam mit :
@RunWith(MockitoJUnitRunner.class)
public class HashLinkerControllerServiceLayerTest {
private static final Logger LOGGER = Logger
.getLogger(HashLinkerControllerServiceLayerTest.class);
@Mock
private HashLinkerService serviceMock;
@InjectMocks
//@Mock
private HashLinkerModel modelMock;
private HashLinkerController controller;
private MockMvc mockMvc;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
controller = new HashLinkerController(modelMock);
this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
kann, und der test mit
@Test
public void update() throws Exception {
int date = 123;
String hashToCheck = "asdfasdfasdfasdfas";
HashLinker first = this.createHashLinker(hashToCheck, "some name",
"some des", "some data", date);
when(serviceMock.update(first)).then(returnsFirstArg());
mockMvc.perform(
put("/api/hashService/" + hashToCheck)
.contentType(TestUtil.APPLICATION_JSON_UTF8)
.content(
TestUtil.convertObjectToJsonBytesWithSettersOnly(first))
.accept(TestUtil.APPLICATION_JSON_UTF8))
.andExpect(status().isOk())
.andExpect(
content().contentType(TestUtil.APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$.hash", is(hashToCheck)))
.andExpect(jsonPath("$.description", is("some des")))
.andExpect(jsonPath("$.name", is("some name")));
verify(serviceMock, times(1)).update(first);
verifyNoMoreInteractions(serviceMock);
}
den test ist die gleiche wie oben, erwarten, dass ich mich geändert habe modelMock
zu serviceMock
. für einige Grund, warum dieser test fehlschlägt . bekomme ich 404.
irgendwelche Ideen?
version:
<spring.core.version>3.2.6.RELEASE</spring.core.version>
<spring.test.version>3.2.6.RELEASE</spring.test.version>
<mockito.version>1.9.5</mockito.version>
<junit.version>4.8.2</junit.version>
BEARBEITEN:
@Component
public class HashLinkerModel {
private static final Logger LOGGER = Logger.getLogger(HashLinkerModel.class);
HashLinkerService service;
/** The unicode service. */
UnicodeService unicodeService;
@Autowired
public HashLinkerModel(HashLinkerService service, UnicodeService unicodeService){
this.service = service;
this.unicodeService = unicodeService;
}
/**
* check if hash exists before creation
* @param toHash
* @return
*/
private HashLinker checkAndcreate(HashLinker toHash){
String hash = this.createHash(toHash.getData());
toHash.setHash(hash);
LOGGER.info("add " + hash + ". this is the hash of string " + toHash.getData());
/* if this hash already in system. return null. otherwise create */
HashLinker exists = service.findByHash(toHash.getHash());
if (null != exists)
return exists;
//** we use service here **
return service.create(toHash);
}
public HashLinker create(HashLinker entity) {
//TODO Auto-generated method stub
RestPreconditions.checkRequestElementNotNull(entity, LOGGER);
RestPreconditions.checkRequestElementNotNull(entity.getData(), LOGGER);
String uniName = getUniHelper().unicode(entity.getName());
String uniDesc = getUniHelper().unicode(entity.getDescription());
HashLinker toHash = new HashLinker();
toHash.setData(entity.getData());
toHash.setType(entity.getType());
String baseURL = entity.getBaseURL();
if (null != baseURL)
baseURL = (baseURL.length() > HashLinker.getIntMaxBaseURL()) ? baseURL.substring(0, HashLinker.getIntMaxBaseURL()) : baseURL;
toHash.setBaseURL(baseURL);
toHash.setStatus(0);
//update lecker's macros results
toHash.setName(uniName);
toHash.setDescription(uniDesc);
return checkAndcreate(toHash);
}
HashLinkerModel
ist mit HashLinkerService.update(first)
ich habe den relevanten hashLinkerModel code. Dank
Danke, aber in diesem code
HashLinkerService.update(first)
nie ausgeführt, vielleicht ist das das problem. Auch modelMock.update(first)
ist hier nicht sichtbar, sieht aus wie dieser code ist unabhängig von unit-Tests. Zeigen Sie mir Ihre update()
Methode.update bekommen hat Feuer. von
checkAndCreate
bekommt Feuer von create
InformationsquelleAutor oak | 2014-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Setzen Sie Ihre Linie
nach
aber vor mockMvc assertions, um sicherzustellen, dass Ihre mock verwendet.
Allgemeine Probleme mit deinem code:
Mit Anmerkung
@RunWith(MockitoJUnitRunner.class)
initialisieren Mockito manuell ist nicht nötig.Unit-Tests
Als drei Ebenen werden in den test einbezogen, der test ist ein integration test.
In unit-Tests ist es besser, viele kleine Methode für die Erprobung unterschiedlicher Verhaltensweisen. So eine Methode sollte test HTTP-Antwort, die zweite soll überprüfen, ob Dienst aufgerufen.
verify
nach Anweisung durchführen. service nicht aufgerufen werden. ehrlich gesagt, bekomme ich Fehler 404. was bedeutet, dass etwas mit der Steuerung nicht richtig funktioniert, oder nicht ? vielleicht ist meine 3. Schicht-Struktur, wie Sie init -, die test sind nicht erlaubt, mit Feder ?Wir brauchen mehr Daten, die uns Zeigen
HashLinkerModel
undHashLinkerService
InformationsquelleAutor MariuszS