Junit Test for InputStreamReader with Mockito
Can you please help me in writing the Junit test case for the below code?
public class ConsoleReader implements InputReader {
public Cell readInput() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = reader.readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
}
java junit mockito
add a comment |
Can you please help me in writing the Junit test case for the below code?
public class ConsoleReader implements InputReader {
public Cell readInput() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = reader.readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
}
java junit mockito
1
Insteed ofnew InputStreamReader(System.in)
passSystem.in
as method argument so you will be able to actually push data into the stream.
– Antoniossss
Nov 20 '18 at 12:10
Possible duplicate of Mocking Java InputStream
– Renny
Nov 20 '18 at 13:01
1
as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
– hunter
Nov 20 '18 at 13:57
add a comment |
Can you please help me in writing the Junit test case for the below code?
public class ConsoleReader implements InputReader {
public Cell readInput() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = reader.readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
}
java junit mockito
Can you please help me in writing the Junit test case for the below code?
public class ConsoleReader implements InputReader {
public Cell readInput() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = reader.readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
}
java junit mockito
java junit mockito
edited Nov 20 '18 at 12:08
Sunny
asked Nov 20 '18 at 12:02
SunnySunny
17013
17013
1
Insteed ofnew InputStreamReader(System.in)
passSystem.in
as method argument so you will be able to actually push data into the stream.
– Antoniossss
Nov 20 '18 at 12:10
Possible duplicate of Mocking Java InputStream
– Renny
Nov 20 '18 at 13:01
1
as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
– hunter
Nov 20 '18 at 13:57
add a comment |
1
Insteed ofnew InputStreamReader(System.in)
passSystem.in
as method argument so you will be able to actually push data into the stream.
– Antoniossss
Nov 20 '18 at 12:10
Possible duplicate of Mocking Java InputStream
– Renny
Nov 20 '18 at 13:01
1
as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
– hunter
Nov 20 '18 at 13:57
1
1
Insteed of
new InputStreamReader(System.in)
pass System.in
as method argument so you will be able to actually push data into the stream.– Antoniossss
Nov 20 '18 at 12:10
Insteed of
new InputStreamReader(System.in)
pass System.in
as method argument so you will be able to actually push data into the stream.– Antoniossss
Nov 20 '18 at 12:10
Possible duplicate of Mocking Java InputStream
– Renny
Nov 20 '18 at 13:01
Possible duplicate of Mocking Java InputStream
– Renny
Nov 20 '18 at 13:01
1
1
as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
– hunter
Nov 20 '18 at 13:57
as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
– hunter
Nov 20 '18 at 13:57
add a comment |
2 Answers
2
active
oldest
votes
You can use Mockito to mock the BufferedReader, like the example below.
BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
Mockito.when(bufferedReader.readLine()).thenReturn("1", "2", "3");
// You can mock the result based on the type of result you are expecting.
But he must pass that mock first.
– Antoniossss
Nov 20 '18 at 12:37
add a comment |
Extract the
reader
as a field. (You can initiaize it either directly or in constructor)
private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Define a getter (either
public
orprotected
)
protected BufferedReader getReader(){
return reader;
}
Remove initialization of
new BufferedReader(...)
from your method. Retrieve it usinggetReader()
instead.
public Cell readInput() {
try {
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = getReader().readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
In your test class initialize your
ConsoleReader
asMockito.spy
ConsoleReader consoleReader = spy(new ConsoleReader());
Mock your getter
@Before
public void setUp() {
BufferedReader bufferedReader = mock(BufferedReader.class);
doReturn(bufferedReader).when(consoleReader).getReader();
doCallRealMethod().when(consoleReader).readInput();
}
Define your test:
@Test
public void testReadInput() {
when(bufferedReader.readLine()).thenReturn("123,456");
Cell expectedCell = new Cell(123, 456);
Cell actualCell = consoleReader.readInput();
assertEquals(expectedCell, actualCell);
}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392599%2fjunit-test-for-inputstreamreader-with-mockito%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can use Mockito to mock the BufferedReader, like the example below.
BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
Mockito.when(bufferedReader.readLine()).thenReturn("1", "2", "3");
// You can mock the result based on the type of result you are expecting.
But he must pass that mock first.
– Antoniossss
Nov 20 '18 at 12:37
add a comment |
You can use Mockito to mock the BufferedReader, like the example below.
BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
Mockito.when(bufferedReader.readLine()).thenReturn("1", "2", "3");
// You can mock the result based on the type of result you are expecting.
But he must pass that mock first.
– Antoniossss
Nov 20 '18 at 12:37
add a comment |
You can use Mockito to mock the BufferedReader, like the example below.
BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
Mockito.when(bufferedReader.readLine()).thenReturn("1", "2", "3");
// You can mock the result based on the type of result you are expecting.
You can use Mockito to mock the BufferedReader, like the example below.
BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
Mockito.when(bufferedReader.readLine()).thenReturn("1", "2", "3");
// You can mock the result based on the type of result you are expecting.
answered Nov 20 '18 at 12:33
joemokenelajoemokenela
1616
1616
But he must pass that mock first.
– Antoniossss
Nov 20 '18 at 12:37
add a comment |
But he must pass that mock first.
– Antoniossss
Nov 20 '18 at 12:37
But he must pass that mock first.
– Antoniossss
Nov 20 '18 at 12:37
But he must pass that mock first.
– Antoniossss
Nov 20 '18 at 12:37
add a comment |
Extract the
reader
as a field. (You can initiaize it either directly or in constructor)
private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Define a getter (either
public
orprotected
)
protected BufferedReader getReader(){
return reader;
}
Remove initialization of
new BufferedReader(...)
from your method. Retrieve it usinggetReader()
instead.
public Cell readInput() {
try {
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = getReader().readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
In your test class initialize your
ConsoleReader
asMockito.spy
ConsoleReader consoleReader = spy(new ConsoleReader());
Mock your getter
@Before
public void setUp() {
BufferedReader bufferedReader = mock(BufferedReader.class);
doReturn(bufferedReader).when(consoleReader).getReader();
doCallRealMethod().when(consoleReader).readInput();
}
Define your test:
@Test
public void testReadInput() {
when(bufferedReader.readLine()).thenReturn("123,456");
Cell expectedCell = new Cell(123, 456);
Cell actualCell = consoleReader.readInput();
assertEquals(expectedCell, actualCell);
}
add a comment |
Extract the
reader
as a field. (You can initiaize it either directly or in constructor)
private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Define a getter (either
public
orprotected
)
protected BufferedReader getReader(){
return reader;
}
Remove initialization of
new BufferedReader(...)
from your method. Retrieve it usinggetReader()
instead.
public Cell readInput() {
try {
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = getReader().readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
In your test class initialize your
ConsoleReader
asMockito.spy
ConsoleReader consoleReader = spy(new ConsoleReader());
Mock your getter
@Before
public void setUp() {
BufferedReader bufferedReader = mock(BufferedReader.class);
doReturn(bufferedReader).when(consoleReader).getReader();
doCallRealMethod().when(consoleReader).readInput();
}
Define your test:
@Test
public void testReadInput() {
when(bufferedReader.readLine()).thenReturn("123,456");
Cell expectedCell = new Cell(123, 456);
Cell actualCell = consoleReader.readInput();
assertEquals(expectedCell, actualCell);
}
add a comment |
Extract the
reader
as a field. (You can initiaize it either directly or in constructor)
private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Define a getter (either
public
orprotected
)
protected BufferedReader getReader(){
return reader;
}
Remove initialization of
new BufferedReader(...)
from your method. Retrieve it usinggetReader()
instead.
public Cell readInput() {
try {
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = getReader().readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
In your test class initialize your
ConsoleReader
asMockito.spy
ConsoleReader consoleReader = spy(new ConsoleReader());
Mock your getter
@Before
public void setUp() {
BufferedReader bufferedReader = mock(BufferedReader.class);
doReturn(bufferedReader).when(consoleReader).getReader();
doCallRealMethod().when(consoleReader).readInput();
}
Define your test:
@Test
public void testReadInput() {
when(bufferedReader.readLine()).thenReturn("123,456");
Cell expectedCell = new Cell(123, 456);
Cell actualCell = consoleReader.readInput();
assertEquals(expectedCell, actualCell);
}
Extract the
reader
as a field. (You can initiaize it either directly or in constructor)
private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Define a getter (either
public
orprotected
)
protected BufferedReader getReader(){
return reader;
}
Remove initialization of
new BufferedReader(...)
from your method. Retrieve it usinggetReader()
instead.
public Cell readInput() {
try {
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = getReader().readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
In your test class initialize your
ConsoleReader
asMockito.spy
ConsoleReader consoleReader = spy(new ConsoleReader());
Mock your getter
@Before
public void setUp() {
BufferedReader bufferedReader = mock(BufferedReader.class);
doReturn(bufferedReader).when(consoleReader).getReader();
doCallRealMethod().when(consoleReader).readInput();
}
Define your test:
@Test
public void testReadInput() {
when(bufferedReader.readLine()).thenReturn("123,456");
Cell expectedCell = new Cell(123, 456);
Cell actualCell = consoleReader.readInput();
assertEquals(expectedCell, actualCell);
}
answered Nov 20 '18 at 15:06
ETOETO
2,6231628
2,6231628
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392599%2fjunit-test-for-inputstreamreader-with-mockito%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Insteed of
new InputStreamReader(System.in)
passSystem.in
as method argument so you will be able to actually push data into the stream.– Antoniossss
Nov 20 '18 at 12:10
Possible duplicate of Mocking Java InputStream
– Renny
Nov 20 '18 at 13:01
1
as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
– hunter
Nov 20 '18 at 13:57