/*************************************************************************** * Copyright 2006-2016 by Christian Ihle * * contact@kouchat.net * * * * This file is part of KouChat. * * * * KouChat is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation, either version 3 of * * the License, or (at your option) any later version. * * * * KouChat is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with KouChat. * * If not, see <http://www.gnu.org/licenses/>. * ***************************************************************************/ package net.usikkert.kouchat.util; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import net.usikkert.kouchat.junit.ExpectedException; import org.junit.Rule; import org.junit.Test; import org.mockito.MockingDetails; /** * Tests of {@link TestUtils}. * * @author Christian Ihle */ public class TestUtilsTest { @Rule public ExpectedException expectedException = ExpectedException.none(); @Test public void getFieldValueShouldSupportPrivateAndPublicFields() { final TestClass testClass = new TestClass("private", 555); final String privateField = TestUtils.getFieldValue(testClass, String.class, "privateField"); assertEquals("private", privateField); final Integer publicField = TestUtils.getFieldValue(testClass, Integer.class, "publicField"); assertEquals(Integer.valueOf(555), publicField); } @Test public void getFieldValueShouldSupportFieldsWithNull() { final TestClass testClass = new TestClass(null, null); final String privateField = TestUtils.getFieldValue(testClass, String.class, "privateField"); assertNull(privateField); } @Test public void getFieldValueShouldSupportInheritedPrivateAndPublicFields() { final ExtendingTestClass extendingTestClass = new ExtendingTestClass("private", 555); final String privateField = TestUtils.getFieldValue(extendingTestClass, String.class, "privateField"); assertEquals("private", privateField); final Integer publicField = TestUtils.getFieldValue(extendingTestClass, Integer.class, "publicField"); assertEquals(Integer.valueOf(555), publicField); } @Test public void getFieldValueShouldThrowExceptionIfInvalidFieldName() { expectedException.expect(RuntimeException.class); expectedException.expectMessage("java.lang.NoSuchFieldException: wrongField"); final TestClass testClass = new TestClass(null, null); TestUtils.getFieldValue(testClass, String.class, "wrongField"); } @Test public void getFieldValueShouldThrowExceptionIfInvalidFieldClass() { expectedException.expect(ClassCastException.class); // The message seems to be missing in some versions of the JDK, so can't verify reliably // expectedException.expectMessage("Cannot cast java.lang.String to java.lang.Integer"); final TestClass testClass = new TestClass("test", 1); TestUtils.getFieldValue(testClass, Integer.class, "privateField"); } @Test public void setFieldValueShouldSupportPrivateAndPublicFields() { final TestClass testClass = new TestClass("test", 1); TestUtils.setFieldValue(testClass, "publicField", 50); TestUtils.setFieldValue(testClass, "privateField", "something"); assertEquals(Integer.valueOf(50), testClass.publicField); assertEquals("something", testClass.getPrivateField()); } @Test public void setFieldValueShouldSupportInheritedPrivateAndPublicFields() { final ExtendingTestClass extendingTestClass = new ExtendingTestClass("test", 1); TestUtils.setFieldValue(extendingTestClass, "publicField", 50); TestUtils.setFieldValue(extendingTestClass, "privateField", "something"); assertEquals(Integer.valueOf(50), extendingTestClass.publicField); assertEquals("something", extendingTestClass.getPrivateField()); } @Test public void setFieldValueShouldSupportSettingNull() { final TestClass testClass = new TestClass("test", 1); TestUtils.setFieldValue(testClass, "publicField", null); TestUtils.setFieldValue(testClass, "privateField", null); assertNull(testClass.publicField); assertNull(testClass.getPrivateField()); } @Test public void setFieldValueShouldThrowExceptionIfInvalidFieldName() { expectedException.expect(RuntimeException.class); expectedException.expectMessage("java.lang.NoSuchFieldException: wrongField"); final TestClass testClass = new TestClass(null, null); TestUtils.setFieldValue(testClass, "wrongField", null); } @Test public void setFieldValueWithMockShouldCreateAMockAndSetTheMockInTheCorrectFieldAndReturnTheMock() { final CustomTestClass customTestClass = new CustomTestClass(); assertNull(customTestClass.getTestClass()); final TestClass testClassMock = TestUtils.setFieldValueWithMock(customTestClass, "testClass", TestClass.class); assertSame(testClassMock, customTestClass.getTestClass()); final MockingDetails mockingDetails = mockingDetails(testClassMock); assertTrue(mockingDetails.isMock()); } @Test public void fieldValueIsNullShouldBeTrueIfNull() { assertTrue(TestUtils.fieldValueIsNull(new TestClass(null, 1), "privateField")); } @Test public void fieldValueIsNullShouldBeFalseIfNotNull() { assertFalse(TestUtils.fieldValueIsNull(new TestClass("not null", 1), "privateField")); } @Test public void allFieldsAreNullShouldBeFalseIfAFieldHaveAValue() { assertFalse(TestUtils.allFieldsAreNull(new TestClass("not null", 1))); assertFalse(TestUtils.allFieldsAreNull(new TestClass("not null", null))); assertFalse(TestUtils.allFieldsAreNull(new TestClass(null, 3))); } @Test public void allFieldsAreNullShouldBeTrueIfAllFieldsHaveNullValues() { assertTrue(TestUtils.allFieldsAreNull(new TestClass(null, null))); } @Test public void allFieldsAreNullShouldBeTrueEvenIfPrimitiveFieldExists() { assertTrue(TestUtils.allFieldsAreNull(new PrimitiveTestClass(true))); } @Test public void allFieldsHaveValueShouldBeFalseIfAFieldIsNull() { assertFalse(TestUtils.allFieldsHaveValue(new TestClass(null, null))); assertFalse(TestUtils.allFieldsHaveValue(new TestClass("not null", null))); assertFalse(TestUtils.allFieldsHaveValue(new TestClass(null, 3))); } @Test public void allFieldsHaveValueShouldBeTrueIfAllFieldsHaveValues() { assertTrue(TestUtils.allFieldsHaveValue(new TestClass("not null", 1))); } @Test public void allFieldsHaveValueShouldBeTrueEvenIfPrimitiveFieldExists() { assertTrue(TestUtils.allFieldsHaveValue(new PrimitiveTestClass(true))); } }