/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.api.core.util; import org.mockito.Mock; import org.mockito.testng.MockitoTestNGListener; import org.slf4j.Logger; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Listeners; import org.testng.annotations.Test; import java.io.File; import java.io.Writer; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.slf4j.LoggerFactory.getLogger; /** * @author Mykola Morhun */ @Listeners(value = {MockitoTestNGListener.class}) public class FileLineConsumerTest { private static final Logger LOG = getLogger(FileLineConsumerTest.class); @Mock private Writer writer; private FileLineConsumer fileLineConsumer; private File file; @BeforeMethod public void beforeMethod() throws Exception { file = File.createTempFile("file", ".tmp"); fileLineConsumer = new FileLineConsumer(file); injectWriterMock(fileLineConsumer, writer); } @AfterClass public void afterClass() { if (!file.delete()) { LOG.warn("Failed to remove temporary file: '{}'.", file); } } @Test public void shouldBeAbleToWriteIntoFile() throws Exception { // given final String message = "Test line"; // when fileLineConsumer.writeLine(message); // then verify(writer).write(eq(message)); } @Test public void shouldNotWriteIntoFileAfterConsumerClosing() throws Exception { // given final String message = "Test line"; // when fileLineConsumer.close(); fileLineConsumer.writeLine(message); // then verify(writer, never()).write(anyString()); } /** * Inject Writer mock into FileLineConsumer class. * This allow to test the FileLineConsumer operations. * * @param fileLineConsumer * instance in which mock will be injected * @param writerMock * mock to inject * @throws Exception */ private void injectWriterMock(FileLineConsumer fileLineConsumer, Writer writerMock) throws Exception { Field writerField = fileLineConsumer.getClass().getDeclaredField("writer"); writerField.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(writerField, writerField.getModifiers() & ~Modifier.FINAL); writerField.set(fileLineConsumer, writerMock); } }