De vez em quando no trabalho, eles tentam nos forçar a escrever testes de unidade. Muitos já perceberam que causam um dano. Escrever testes leva muito tempo, pelo qual você pode fazer algo mais útil. Se o teste começar a cair inesperadamente, o assembly será interrompido no servidor de integração contínua, a versão não será lançada com o tempo, a empresa perderá dinheiro e você, o autor do teste de unidade caído, acabará no extremo. Ao refatorar, os testes causam dor de cabeça porque começam a cair e você precisa lidar com isso.
No entanto, chefes do mal exigem mais testes, falando sobre o chamado "controle de qualidade". Os gerentes particularmente astutos consideram a cobertura e não o deixam trabalhar até que seja alcançado. Seu código é agrupado em uma revisão se não houver testes ou se eles não gostaram de algo. Chateado completo!
O que fazer?
Felizmente, existem maneiras de escrever testes de unidade confiáveis que nunca falham. Esses métodos não foram inventados por mim; eles são praticados com sucesso em vários projetos de código aberto. Todos os exemplos que darei são retirados do código real. Portanto, não há motivo e você não pode tirar proveito do que já está sendo colocado em prática por outros desenvolvedores!
A primeira e óbvia maneira: não verifique nada no teste de unidade. Aqui está um exemplo simples :
public void testSetFile() {
    System.out.println("setFile");
    File f = null;
    BlastXMLParser instance = new BlastXMLParser();
    instance.setFile(f);
}
? , , . - , null null'. , .
? :
@Test
public void getParametersTest() {
    List<IGeneratorParameter<?>> parameters = generator.getParameters();
    containsParameterType(parameters, AtomColor.class);
    containsParameterType(parameters, AtomColorer.class);
    containsParameterType(parameters, AtomRadius.class);
    containsParameterType(parameters, ColorByType.class);
    ...
}
, - . containsParameterType:
public <T> boolean containsParameterType(List<IGeneratorParameter<?>> list, Class<T> type) {
    for (IGeneratorParameter<?> item : list) {
        if (item.getClass().getName().equals(type.getName())) return true;
    }
    return false;
}
, ? , . , . !
. , . - . , , , . :
for (int i = 0; i < 0; i++)
{
    Assert.assertTrue(errorProbabilities[i] > 0.0d);
}
0 . . :
List<JavaOperationSignature> sigs = new ArrayList<>();
List<JavaOperationSignature> sigs2 = new ArrayList<>();
for (int i = 0; i < sigs.size(); i++) { 
    sigs.add(JavaOperationSignature.buildFor(nodes.get(i)));
    sigs2.add(JavaOperationSignature.buildFor(nodes2.get(i)));
}
for (int i = 0; i < sigs.size() - 1; i++) { 
    assertTrue(sigs.get(i) == sigs.get(i + 1));
    assertTrue(sigs2.get(i) == sigs2.get(i + 1));
}
! , — . .
, , , . , catch. , . , :
try {
    getDs().save(e);
} catch (Exception ex) {
    return; 
}
Assert.assertFalse("Should have got rejection for dot in field names", true); 
e = getDs().get(e);
Assert.assertEquals("a", e.mymap.get("a.b")); 
Assert.assertEquals("b", e.mymap.get("c.e.g"));
, ? ? , . , . , null:
Assert.assertNotNull(new Electronegativity());
new null, . . , , . — :
DocumentImplementation document = new DocumentImplementation(props);
assertNotNull(document.toString().contains(KEY));
assertNotNull(document.toString().contains(VALUE));
boolean Boolean, , , . , , true false. :
Assert.assertNotNull("could not get nr. of eqr: ", afpChain.getNrEQR());
. , , getNrEQR int .
— , :
Assert.assertNotNull("Attempt to test atom type which is not defined in the " +
     getAtomTypeListName() + ": " + exception.getMessage());
? , - , - . , null, , .
, , , assertNotNull . ! , assertEquals , :
Assert.assertEquals(ac2.getAtomCount(), ac2.getAtomCount());
, , getAtomCount. - !
double, NaN. , assertNotEquals , . assertTrue:
Assert.assertTrue(result1.get(i) != Double.NaN);
, NaN , , .
assertTrue instanceof-:
Assert.assertNotNull(cf.getRealFormat());
Assert.assertNotNull(cf.getImaginaryFormat());
Assert.assertTrue(cf.getRealFormat() instanceof NumberFormat);
Assert.assertTrue(cf.getImaginaryFormat() instanceof NumberFormat);
getRealFormat getImaginaryFormat NumberFormat, instanceof . . .
, . , assertThat AssertJ (, assertThat(somethingIsTrue()) assertThat(somethingIsTrue()).is(true)). try { ... } catch(Throwable t) {} AssertionError. . , CompletableFuture.runAsync() . , , .
. . . , , . ---!