with services mock how example compatible and java mocking mockito junit4 powermock

java - services - Cómo simular variables locales usando mockito o powermock



mockito mock entity (2)

Para que esto funcione, debes usar Powermockito para interceptar las llamadas al constructor (nuevo InputStreamReader (...), nuevo BufferedReader (...)) para que se devuelvan tus simulacros. Un ejemplo es abajo. En su caso, simplemente interceptar la nueva llamada de BufferedReader puede ser suficiente.

Suponga que el siguiente es el código que desea probar:

package test; import java.io.*; public class SUT { public String doSomething() throws IOException { InputStreamReader reader = new InputStreamReader(getFileAsStream(null, null)); BufferedReader bReader = new BufferedReader(reader); return bReader.readLine(); } private InputStream getFileAsStream(Object resourceResolver, Object iconPath) throws FileNotFoundException { return new ByteArrayInputStream("".getBytes()); } }

El siguiente código de prueba es un ejemplo de cómo interceptar las llamadas al constructor:

package test; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.io.BufferedReader; import java.io.InputStreamReader; import static org.junit.Assert.assertEquals; import static org.powermock.api.mockito.PowerMockito.doReturn; import static org.powermock.api.mockito.PowerMockito.mock; @RunWith(PowerMockRunner.class) @PrepareForTest({ SUT.class }) public class SUTTest { @Test public void doSomethingReturnsValueFromBufferedReader() throws Exception { // Arrange SUT sut = new SUT(); InputStreamReader inputStreamReaderMock = mock(InputStreamReader.class); BufferedReader bufferedReaderMock = mock(BufferedReader.class); // Set your mocks up to be returned when the new ...Reader calls // are executed in sut.doSomething() PowerMockito.whenNew(InputStreamReader.class). withAnyArguments().thenReturn(inputStreamReaderMock); PowerMockito.whenNew(BufferedReader.class). withArguments(inputStreamReaderMock). thenReturn(bufferedReaderMock); // Set the value you want bReader.readLine() to return // when sut.doSomething() executes final String bufferedReaderReturnValue = "myValue"; doReturn(bufferedReaderReturnValue).when(bufferedReaderMock).readLine(); // Act String result = sut.doSomething(); // Assert assertEquals(bufferedReaderReturnValue, result); } }

Espero que esto te ayude en tu problema inmediato. Sin embargo, me parece que lo que estás creando será una prueba muy lenta, confusa y frágil. En este momento, te estás burlando tanto que es muy difícil determinar lo que realmente estás tratando de probar.

La gran cantidad de burlas probablemente indica que el diseño del código que está probando necesitaría algún trabajo para mejorar la capacidad de prueba. Si no puede tocar el código, entonces no puede hacerlo, pero intente hacer que su prueba sea más legible e intuitiva ("Cuando se invoca este método, esto debería suceder, porque ...").

Tengo un escenario como este

InputStreamReader reader = new InputStreamReader(getFileAsStream(resourceResolver, iconpath)); BufferedReader bReader = new BufferedReader(reader);

Me he burlado hasta este punto

getFileAsStream(resourceResolver, iconpath)

ahora estoy recibiendo un lector

BufferedReader bReader = new BufferedReader(reader);

pero cuando ejecuto esta línea obtengo nulo y no puedo seguir adelante

while ((iconEntry = bReader.readLine()) != null)

Por favor, dime cómo puedo burlarme de esto. Tenga en cuenta que no puedo cambiar mi código principal, por lo tanto, la solución presente en los documentos de Mockito no es válida en mi caso

Código de prueba

@RunWith(PowerMockRunner.class) @PrepareForTest({ FrameworkUtil.class, LoggerFactory.class }) public class IconPreviewServletTest { private IconPreviewServlet iconPreviewServlet; private SlingHttpServletRequest request; private SlingHttpServletResponse response; private Bundle bundle; private BundleContext bundleContext; private ServiceReference factoryRef; private CommonService resolverFactory; private PrintWriter out; private ResourceResolver resourceResolver; private Resource resource; private Node node; private Node jcrContent; private javax.jcr.Property property; private Binary binary; private InputStream stream; private InputStreamReader inputReader; private BufferedReader reader; @Before public void setUp() throws IOException, PathNotFoundException, RepositoryException { init(); } private void init() throws IOException, PathNotFoundException, RepositoryException { request = mock(SlingHttpServletRequest.class); response = mock(SlingHttpServletResponse.class); bundleContext = mock(BundleContext.class); factoryRef = mock(ServiceReference.class); resolverFactory = mock(CommonService.class); out = mock(PrintWriter.class); resourceResolver = mock(ResourceResolver.class); resource = mock(Resource.class); node = mock(Node.class); jcrContent = mock(Node.class); property = mock(Property.class); binary = mock(Binary.class); stream=IOUtils.toInputStream("some test data for my input stream"); reader = mock(BufferedReader.class); inputReader=mock(InputStreamReader.class); bundle = mock(Bundle.class); mockStatic(FrameworkUtil.class); mockStatic(LoggerFactory.class); Logger log = mock(Logger.class); when(LoggerFactory.getLogger(IconPreviewServlet.class)).thenReturn(log); when(FrameworkUtil.getBundle(CommonService.class)).thenReturn(bundle); when(bundle.getBundleContext()).thenReturn(bundleContext); when(bundleContext.getServiceReference(CommonService.class.getName())) .thenReturn(factoryRef); when(bundleContext.getService(factoryRef)).thenReturn(resolverFactory); when(request.getParameter("category")).thenReturn("category"); when(request.getParameter("query")).thenReturn("query"); when(response.getWriter()).thenReturn(out); when(request.getResourceResolver()).thenReturn(resourceResolver); when( resourceResolver .getResource("/etc/designs/resmed/icons/category/icons.txt")) .thenReturn(resource); when(resource.adaptTo(Node.class)).thenReturn(node); when(node.getNode("jcr:content")).thenReturn(jcrContent); when(jcrContent.getProperty("jcr:data")).thenReturn(property); when(property.getBinary()).thenReturn(binary); when(binary.getStream()).thenReturn(stream); }


para hacer que esta línea funcione

while ((iconEntry = bReader.readLine()) != null)

debe determinar cuántas líneas quiere leer y agregar esto a su código de prueba:

when(bReader.readLine()).thenReturn("line number one").thenReturn("line number two");