Skip to content

Commit 49f54d2

Browse files
authored
Improved unit test error logging (#4075)
1 parent 135946c commit 49f54d2

File tree

5 files changed

+55
-16
lines changed

5 files changed

+55
-16
lines changed

maven/core-unittests/src/test/java/com/codename1/io/LogTest.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import static org.mockito.ArgumentMatchers.anyString;
2323
import static org.mockito.Mockito.doAnswer;
2424
import static org.mockito.Mockito.mock;
25-
import static org.mockito.Mockito.verify;
2625

2726
class LogTest {
2827
private Log originalLog;
@@ -95,20 +94,6 @@ void printRespectsLogLevelAndWritesToWriter() throws IOException {
9594
assertTrue(systemOutMessages.stream().anyMatch(s -> s.contains("accepted")));
9695
}
9796

98-
@Test
99-
void logThrowableWritesExceptionDetails() throws IOException {
100-
testLog.resetContent();
101-
systemOutMessages.clear();
102-
103-
RuntimeException failure = new RuntimeException("boom");
104-
Log.e(failure);
105-
106-
String content = testLog.getWrittenContent();
107-
assertTrue(content.contains("Exception: java.lang.RuntimeException - boom"));
108-
assertTrue(content.contains("stack"));
109-
verify(mockImplementation).printStackTraceToStream(any(), any());
110-
}
111-
11297
@Test
11398
void setFileURLRecreatesWriter() throws IOException {
11499
testLog.resetContent();
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.codename1.junit;
2+
3+
import com.codename1.io.Log;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class TestLogger extends Log {
9+
private List<Throwable> throwables = new ArrayList<>();
10+
private List<String> printed = new ArrayList<>();
11+
private static Log original;
12+
public static void install() {
13+
if(getInstance() instanceof TestLogger) {
14+
throw new IllegalStateException("Test logger already installed");
15+
}
16+
original = getInstance();
17+
install(new TestLogger());
18+
}
19+
20+
public static void remove() {
21+
install(original);
22+
}
23+
24+
@Override
25+
protected void logThrowable(Throwable t) {
26+
throwables.add(t);
27+
}
28+
29+
@Override
30+
protected void print(String text, int level) {
31+
printed.add(text);
32+
}
33+
34+
public static List<String> getPrinted() {
35+
return ((TestLogger)getInstance()).printed;
36+
}
37+
38+
public static List<Throwable> getThrowables() {
39+
return ((TestLogger)getInstance()).throwables;
40+
}
41+
}

maven/core-unittests/src/test/java/com/codename1/payment/PurchaseTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import com.codename1.io.TestImplementationProvider;
55
import com.codename1.io.Util;
66
import com.codename1.impl.CodenameOneImplementation;
7+
import com.codename1.junit.TestLogger;
78
import com.codename1.ui.Display;
89
import com.codename1.util.SuccessCallback;
910
import org.junit.jupiter.api.AfterEach;
1011
import org.junit.jupiter.api.BeforeEach;
1112
import org.junit.jupiter.api.Test;
1213

14+
import java.io.IOException;
1315
import java.lang.reflect.Field;
1416
import java.util.ArrayList;
1517
import java.util.Arrays;
@@ -79,6 +81,7 @@ public void refund(String sku) {
7981

8082
@BeforeEach
8183
public void setup() throws Exception {
84+
TestLogger.install();
8285
Field receiptsKeyField = Purchase.class.getDeclaredField("RECEIPTS_KEY");
8386
receiptsKeyField.setAccessible(true);
8487
receiptsKey = (String) receiptsKeyField.get(null);
@@ -131,6 +134,7 @@ public void tearDown() throws Exception {
131134
Field storageInstanceField = Storage.class.getDeclaredField("INSTANCE");
132135
storageInstanceField.setAccessible(true);
133136
storageInstanceField.set(null, originalStorageInstance);
137+
TestLogger.remove();
134138
}
135139

136140
private void resetPurchaseStatics() throws Exception {
@@ -175,7 +179,7 @@ public void testPostReceiptStoresPendingReceipt() {
175179
}
176180

177181
@Test
178-
public void testGetReceiptsLoadsFromStorageAndCaches() {
182+
public void testGetReceiptsLoadsFromStorageAndCaches() throws IOException {
179183
List<Receipt> stored = new ArrayList<Receipt>();
180184
stored.add(createReceipt("basic", new Date(1000L), new Date(2000L)));
181185
Storage.getInstance().writeObject(receiptsKey, new ArrayList<Receipt>(stored));
@@ -203,6 +207,7 @@ public void testGetReceiptsReturnsEmptyListWhenStoredDataHasUnexpectedType() thr
203207
assertTrue(receipts.isEmpty(), "Unexpected data should clear cached receipts");
204208
assertEquals("bad-data", Storage.getInstance().readObject(receiptsKey),
205209
"Storage contents should remain untouched when data cannot be cast");
210+
assertEquals(1, TestLogger.getThrowables().size(), "An exception should have been logged");
206211
resetPurchaseStatics();
207212
}
208213

maven/core-unittests/src/test/java/com/codename1/testing/TestReportingTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.codename1.impl.CodenameOneImplementation;
44
import com.codename1.io.Util;
5+
import com.codename1.junit.TestLogger;
56
import org.junit.jupiter.api.AfterEach;
67
import org.junit.jupiter.api.BeforeEach;
78
import org.junit.jupiter.api.Test;
@@ -24,6 +25,7 @@ class TestReportingTest {
2425

2526
@BeforeEach
2627
void installImplementation() {
28+
TestLogger.install();
2729
implementation = mock(CodenameOneImplementation.class);
2830
when(implementation.isInitialized()).thenReturn(true);
2931
when(implementation.handleEDTException(any(Throwable.class))).thenReturn(false);
@@ -34,6 +36,7 @@ void installImplementation() {
3436
void resetSingleton() {
3537
TestReporting.setInstance(null);
3638
Util.setImplementation(null);
39+
TestLogger.remove();
3740
}
3841

3942
@Test
@@ -51,6 +54,7 @@ void finishedTestCaseStoresResultsAndWritesReport() throws Exception {
5154
String report = new String(out.toByteArray(), "UTF-8");
5255
assertTrue(report.contains("alpha passed"));
5356
assertTrue(report.contains("beta failed"));
57+
assertTrue(!TestLogger.getPrinted().isEmpty());
5458
}
5559

5660
@Test

maven/core-unittests/src/test/java/com/codename1/testing/TestRunnerComponentTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.codename1.testing;
22

3+
import com.codename1.junit.TestLogger;
34
import com.codename1.test.UITestBase;
45
import com.codename1.ui.Button;
56
import com.codename1.ui.Container;
@@ -67,6 +68,7 @@ void showFormCreatesAndReusesHostForm() {
6768

6869
@Test
6970
void runTestsAddsFailureActionListenerOnException() throws Exception {
71+
TestLogger.install();
7072
RuntimeException failure = new RuntimeException("explode");
7173
TestRunnerComponent component = new TestRunnerComponent();
7274
component.add(new SimpleTest("Explosive", true, true, failure));
@@ -90,6 +92,8 @@ void runTestsAddsFailureActionListenerOnException() throws Exception {
9092
}
9193
}
9294
assertTrue(found);
95+
assertEquals(1, TestLogger.getThrowables().size());
96+
TestLogger.remove();
9397
}
9498

9599
private Container getResultsPane(TestRunnerComponent component) throws Exception {

0 commit comments

Comments
 (0)