Тестовый пример JUnit: аргумент (ы) разные! В розыске: - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь написать JUnit Контрольный пример для POST запроса на уровне контроллера с использованием mockito. Когда я делаю Mockito.verify Я получаю тестовый сбой

AccountMaintenanceSave

public class AccountMaintenanceSave {   

    public Integer nAccountId;
    public String sClientAcctId;
    public String sAcctDesc;
    public String sLocation;
    public Integer nDeptId; 
    public Integer nAccountCPCMappingid;    
    public Integer nInvestigatorId;

    //Getter and Setter

    @Override
    public String toString() {
        return "AccountMaintenanceSave [nAccountId=" + nAccountId + ", sClientAcctId=" + sClientAcctId + ", sAcctDesc="
                + sAcctDesc + ", sLocation=" + sLocation + ", nDeptId=" + nDeptId + ", nAccountCPCMappingid="
                + nAccountCPCMappingid + ", nInvestigatorId=" + nInvestigatorId + "]";
    }       
    @Override
    public boolean equals(Object accountMain) {
        if (this == accountMain) return true;
        if (accountMain == null || getClass() != accountMain.getClass()) return false;

        final AccountMaintenanceSave that = (AccountMaintenanceSave) accountMain;

        if (nAccountId != that.nAccountId) return false;
        if (nAccountCPCMappingid != that.nAccountCPCMappingid) return false;
        if (nDeptId != that.nDeptId) return false;
        if (nInvestigatorId != that.nInvestigatorId) return false;
        if (sLocation != null ? !sLocation.equals(that.sLocation) : that.sLocation != null) return false;
        if (sAcctDesc != null ? !sAcctDesc.equals(that.sAcctDesc) : that.sAcctDesc != null) return false;
        return sClientAcctId != null ? sClientAcctId.equals(that.sClientAcctId) : that.sClientAcctId == null;
    }

    @Override
    public int hashCode() {
        int result = nAccountId;
        result = 31 * result + (sLocation != null ? sLocation.hashCode() : 0);
        result = 31 * result + nAccountCPCMappingid;
        result = 31 * result + (sAcctDesc != null ? sAcctDesc.hashCode() : 0);
        result = 31 * result + nDeptId;
        result = 31 * result + (sClientAcctId != null ? sClientAcctId.hashCode() : 0);
        result = 31 * result + nInvestigatorId;
        return result;
    }
}

AccountController

@RestController
@RequestMapping("/api.spacestudy.com/SpaceStudy/Admin")
public class AccountController {

    @Autowired
    AccountService accService;

    @CrossOrigin(origins = "http://localhost:4200")
    @PutMapping("/Account/saveAttributes")
    public  ResponseEntity<Object> btnSaveClick(@RequestBody AccountMaintenanceSave saveObj) {
        return accService.btnSaveClick(saveObj);// line no 42

    }   

AccountControllerTest

@RunWith(SpringRunner.class)
public class AccountControllerTest {

    private MockMvc mockMvc;

    @Mock
    private AccountService accountService;

    @InjectMocks
    private AccountController accountController;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(accountController).build();
    }

    @Test
    public void btnSaveClickTest() throws Exception {

        String json = "{\n" + " \"nAccountId\":65175, \"sLocation\": \"B\",\n"
              + " \"nAccountCPCMappingid\":8 ,\"sAcctDesc\":\"FY07 GEN GIFTS\" ,\n"
              + " \"nDeptId\":21728, \"sClientAcctId\":\"2100012\",\n" 
              + " \"nInvestigatorId\":65760 }";

        AccountMaintenanceSave accountMain = new AccountMaintenanceSave();
    accountMain.setnAccountId(65175);
    accountMain.setsLocation("B");
    accountMain.setnAccountCPCMappingid(8);
    accountMain.setsAcctDesc("FY07 GEN GIFTS");
    accountMain.setnDeptId(21728);
    accountMain.setsClientAcctId("2100012");
    accountMain.setnInvestigatorId(65760);

    Mockito.when(accountService.btnSaveClick(accountMain))
            .thenReturn(new ResponseEntity<>(accountMain.toString(), HttpStatus.OK));

    RequestBuilder requestBuilder = MockMvcRequestBuilders
            .put("/api.spacestudy.com/SpaceStudy/Admin/Account/saveAttributes").accept(MediaType.APPLICATION_JSON)
            .contentType(MediaType.APPLICATION_JSON).content(json);

    MvcResult result = mockMvc.perform(requestBuilder).andReturn();

    MockHttpServletResponse response = result.getResponse();

    assertEquals(HttpStatus.OK.value(), response.getStatus());

    Mockito.verify(accountService).btnSaveClick(accountMain).toString();
    }
}

Трассировка стека

   Argument(s) are different! Wanted:
accountService.btnSaveClick(
    AccountMaintenanceSave [nAccountId=65175, sClientAcctId=2100012, sAcctDesc=FY07 GEN GIFTS, sLocation=B, nDeptId=21728, nAccountCPCMappingid=8, nInvestigatorId=65760]
);
-> at com.spacestudy.AccountControllerTest.btnSaveClickTest(AccountControllerTest.java:71)
Actual invocation has different arguments:
accountService.btnSaveClick(
    AccountMaintenanceSave [nAccountId=65175, sClientAcctId=2100012, sAcctDesc=FY07 GEN GIFTS, sLocation=B, nDeptId=21728, nAccountCPCMappingid=8, nInvestigatorId=65760]
);
-> at com.spacestudy.controller.AccountController.btnSaveClick(AccountController.java:42)

    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.spacestudy.AccountControllerTest.btnSaveClickTest(AccountControllerTest.java:71)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

1 Ответ

0 голосов
/ 03 мая 2018

Основываясь на вашем equals методе, создается впечатление, что вы сравниваете Объекты (примитивы в штучной упаковке) на основе ссылочного равенства . Это ошибка независимо от того, используете ли вы Mockito и как.

Хотя примитивы типа int можно безопасно сравнивать с помощью ==, коробочные примитивы типа Integer не следует сравнивать с ==: у вас может быть два отдельных экземпляра Integer, каждый из которых представляет целое число 3, например firstInt != secondInt но firstInt.equals(secondInt) верно. Это может привести к противоречивому поведению: Java оппортунистически пытается использовать один и тот же экземпляр для строковых литералов и небольших целых чисел, но вы не можете полагаться на это поведение. Это также приведет к тому, что ваш вывод toString будет идентичным, как вы видите.

Лучший ответ здесь - использовать примитивы, такие как int, а не коробочные примитивы, такие как Integer: Пока результаты всегда ненулевые, вы ничего не получите, сохраняя коробочные версии. Если вы сделаете это, то ваш текущий метод equals (впервые опубликованный с помощью gtching в удаленном ответе) будет работать нормально.


Если по какой-либо причине вам необходимо остаться с коробочными примитивами, вам действительно следует сравнивать их с методами equals.

Так что вместо чеков вроде:

    if (nAccountId != that.nAccountId) return false;
    if (nAccountCPCMappingid != that.nAccountCPCMappingid) return false;

Выполните проверки следующим образом:

    if (!nAccountId.equals(that.nAccountId)) return false;
    if (!nAccountCPCMappingid.equals(that.nAccountCPCMappingid)) return false;

Обратите внимание, что целочисленные поля, такие как строковые поля, могут быть null. Чтобы избежать этого, вы должны явно проверить null, как вы это делали со строками, или использовать новый метод Objects.equals в Java 8:

    if (!Objects.equals(this.nAccountId, that.nAccountId)) return false;
    if (!Objects.equals(this.nAccountCPCMappingid, that.nAccountCPCMappingid)) return false;
...