/
githubmirror
/
guava
Обзор
Документация
Войти
/
githubmirror
/
guava
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
android/guava-testlib/test/com/google/common/testing/TearDownStackTest.java
167 строк
4 KB
cpovirk
Use yet more `assertThrows` (and a tiny bit more Truth).
27 июн 2026, 01:53
27 июн 2026, 01:53
d160300
Код
Авторство
О чём код?
/* * Copyright (C) 2010 The Guava Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.common.testing; import static com.google.common.collect.Iterables.getOnlyElement; import static com.google.common.truth.Truth.assertThat; import static java.util.Arrays.asList; import static org.junit.Assert.assertThrows; import com.google.common.annotations.GwtCompatible; import junit.framework.TestCase; import org.jspecify.annotations.NullUnmarked; import org.jspecify.annotations.Nullable; /** * @author Luiz-Otavio "Z" Zorzella */ @GwtCompatible @NullUnmarked public class TearDownStackTest extends TestCase { private final TearDownStack tearDownStack = new TearDownStack(); public void testSingleTearDown() { TearDownStack stack = buildTearDownStack(); SimpleTearDown tearDown = new SimpleTearDown(); stack.addTearDown(tearDown); assertEquals(false, tearDown.ran); stack.runTearDown(); assertEquals("tearDown should have run", true, tearDown.ran); } public void testMultipleTearDownsHappenInOrder() { TearDownStack stack = buildTearDownStack(); SimpleTearDown tearDownOne = new SimpleTearDown(); stack.addTearDown(tearDownOne); Callback callback = new Callback() { @Override public void run() { assertEquals( "tearDownTwo should have been run before tearDownOne", false, tearDownOne.ran); } }; SimpleTearDown tearDownTwo = new SimpleTearDown(callback); stack.addTearDown(tearDownTwo); assertEquals(false, tearDownOne.ran); assertEquals(false, tearDownTwo.ran); stack.runTearDown(); assertEquals("tearDownOne should have run", true, tearDownOne.ran); assertEquals("tearDownTwo should have run", true, tearDownTwo.ran); } public void testThrowingTearDown() { TearDownStack stack = buildTearDownStack(); ThrowingTearDown tearDownOne = new ThrowingTearDown("one"); stack.addTearDown(tearDownOne); ThrowingTearDown tearDownTwo = new ThrowingTearDown("two"); stack.addTearDown(tearDownTwo); assertEquals(false, tearDownOne.ran); assertEquals(false, tearDownTwo.ran); RuntimeException expected = assertThrows(RuntimeException.class, () -> stack.runTearDown()); assertThat(expected).hasMessageThat().isEqualTo("two"); assertThat(getOnlyElement(asList(expected.getSuppressed()))).hasMessageThat().isEqualTo("one"); assertEquals(true, tearDownOne.ran); assertEquals(true, tearDownTwo.ran); } @Override public final void runBare() throws Throwable { try { setUp(); runTest(); } finally { tearDown(); } } @Override protected void tearDown() { tearDownStack.runTearDown(); } /** Builds a {@link TearDownStack} that makes sure it's clear by the end of this test. */ private TearDownStack buildTearDownStack() { TearDownStack result = new TearDownStack(); tearDownStack.addTearDown( () -> { synchronized (result.lock) { assertEquals( "The test should have cleared the stack (say, by virtue of running runTearDown)", 0, result.stack.size()); } }); return result; } private static final class ThrowingTearDown implements TearDown { private final String id; boolean ran = false; ThrowingTearDown(String id) { this.id = id; } @Override public void tearDown() { ran = true; throw new RuntimeException(id); } } private static final class SimpleTearDown implements TearDown { boolean ran = false; @Nullable Callback callback = null; SimpleTearDown() {} SimpleTearDown(Callback callback) { this.callback = callback; } @Override public void tearDown() { if (callback != null) { callback.run(); } ran = true; } } private interface Callback { void run(); } }