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);

}
Zeigen Sie uns, wie 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

Schreibe einen Kommentar