java - Why some hardcoded values in testing affects others? -
i'm trying figure out how write unit tests , stuck @ 1 point:
suppose have 2 tests (view , service mocked):
@test public void shouldstartmainactivitywhenusernameandpassowordarecorrect() throws exception{ when(view.getusername()).thenreturn("james"); when(view.getpassword()).thenreturn("bond"); //bond when(serivce.login("james", "bnd")).thenreturn(true); //bnd gives error presenter.onloginclicked(); verify(view).startmainactivity(); } @test public void shouldshowerrormessangewhenusernameandpasswordareincorrect() throws exception{ when(view.getusername()).thenreturn("james"); when(view.getpassword()).thenreturn("bond"); // bond when(serivce.login("james", "bnd")).thenreturn(false); // bnd gives no error presenter.onloginclicked(); verify(view).showcredentialserror(); } this presenters method:
public void onloginclicked() { string username = view.getusername(); if (username.isempty()){ view.showusernameerror(r.string.username_error); return; } string password = view.getpassword(); if (password.isempty()){ view.showpassworderror(r.string.password_error); } boolean loginsucceeded = service.login(username, password); if (loginsucceeded){ view.startmainactivity(); }else{ view.showcredentialserror(); } } how comes "bnd" hardcoded value compared "bond" hardcoded value method?
for example:
when(view.getpassword()).thenreturn("bond"); //bond when(serivce.login("james", "bnd")).thenreturn(true); //bnd this give me error, while changing
when(view.getpassword()).thenreturn("bond"); //bond when(serivce.login("james", "bond")).thenreturn(true); //bond gives no error.
you have mocked 2 scenarios when service returns boolean saying if login successful or not.
you have following mocks:
mock
view.getusername()returnsjames. whenever method invoked on test class unit test return value.mock
view.getpassword()returnsbond. whenever method invoked on test class unit test return value.mock
serivce.login()takes 2 arguments i.e.{"username","password"}, returns login status i.e.trueorfalse. whenever method invoked on test class unit test same set of parameters return these value.
in first test case returning false mock username: james , password: bnd , in second test returning true same set of parameters.
when(serivce.login("james", "bnd")).thenreturn(true); //bnd gives error
here returning true {"james", "bnd"}.
when(serivce.login("james", "bnd")).thenreturn(false); // bnd gives no error
here returning false {"james", "bnd"}.
right mock not getting executed in either of 2 cases. because username , password in presenters class takes values first 2 mocks i.e. view.getusername() , view.getpassword(). these mocks returning james , bonds respectively in both test cases.
logically should returning true or false test cases if , if arguments {"james","bonds"} , not else. validated parameters returned other 2 mocks , based on whether matches or not, third mock executed , return boolean.
positive scenario:
when(view.getusername()).thenreturn("james"); when(view.getpassword()).thenreturn("bond"); when(serivce.login("james", "bond")).thenreturn(true); /* corrected */ negative scenario:
when(view.getusername()).thenreturn("james"); when(view.getpassword()).thenreturn("bond"); when(serivce.login("james", "bond")).thenreturn(false); /* corrected */
Comments
Post a Comment