Executar o teste Junit em estruturas condicionais

Estou precisando realizar testes em uma classe, mas o método é criado usando estruturas condicionais de modo que fiquei sem sabe como criar os testes.

public class Resultados {

	public static String mostraInformacoes(FigurasGeometricas retangulo, FigurasGeometricas quadrado, FigurasGeometricas circulo) {
		String toString = "";
		// Calculo das áreas
		toString += "       CALCULO DAS AREAS        \n\n";
			
		if (retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) { 
			toString +=  "A área deste retângulo é: " + CalculodeAreas.areaRetangulo(retangulo)  + "\n\n";
		} else {
			toString += "O valor que vc forneceu não representa nenhuma figura geométrica conhecida!\n\n";
		}
		
		if (quadrado.getLarguraQuadrado() > 0) {
			toString +=  "A área deste quadrado é: " + CalculodeAreas.areaQuadrado(quadrado) + "\n\n";
		}else {
			toString += "O valor que vc forneceu não representa nenhuma figura geométrica conhecida!\n\n";
		}
		
		if (circulo.getRaioCirculo() > 0) {
			toString +=  "A área deste círculo é: " + CalculodeAreas.areaCirculo(circulo) + "\n\n";
		} else {
			toString += "O valor que vc forneceu não representa nenhuma figura geométrica conhecida!\n\n";
		}
		
		if ((retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) &&
				(quadrado.getLarguraQuadrado() > 0) && (circulo.getRaioCirculo() > 0)) {
			toString += "Todas as áreas são: " +  CalculodeAreas.areaRetangulo(retangulo) + " " + CalculodeAreas.areaQuadrado(quadrado) + " e " 
					+ CalculodeAreas.areaCirculo(circulo) + " retângulo, quadrado e círculo, respectivamente. \n\n";			
		}
		
		toString += "\n       CALCULO DOS PERIMETROS        \n\n"; 
		
		if (retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) {
			toString +=  "O perímetro deste retângulo é: " + CalculoDePerimetros.perimetroRetangulo(retangulo)  + "\n\n";
		}
		
		if (quadrado.getLarguraQuadrado() > 0) {
			toString +=  "O perímetro deste quadrado é: " + CalculoDePerimetros.perimetroQuadrado(quadrado) + "\n\n";
		}
		
		if (circulo.getRaioCirculo() > 0) {
			toString +=  "O perímetro deste círculo é: " + CalculoDePerimetros.perimetroCirculo(circulo) + "\n\n";			
		}	
		
		if ((retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) &&
				(quadrado.getLarguraQuadrado() > 0) && (circulo.getRaioCirculo() > 0)) {
			toString += "Não foi possível calcular o perímetro total...\n\n";			
		}
		
		
		toString += "\n       CARACTERÍSTICAS DAS FIGURAS       \n\n"; 
		
		if (retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) {
			toString +=  "O retângulo criado tem altura de tamanho: " + retangulo.getAlturaRetangulo() + 
					" e largura de tamanho: " + retangulo.getLarguraRetangulo() + "\n\n"; 
		}	
		
		if (quadrado.getLarguraQuadrado() > 0) {
			toString += "O quadrado criado tem lados de tamanho: " + quadrado.getLarguraQuadrado() + "\n\n"; 
		}
		
		if (circulo.getRaioCirculo() > 0) {
			toString +=  "O circulo criado tem raio de tamanho: " + circulo.getRaioCirculo() + "\n\n"; 
		}
		
		if ((retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) &&
				(quadrado.getLarguraQuadrado() > 0) && (circulo.getRaioCirculo() > 0)) {
			toString += "O retângulo criado tem altura: " + retangulo.getAlturaRetangulo() + " e largura de: " + retangulo.getLarguraRetangulo() +
					", o quadrado criado tem lados: " + quadrado.getLarguraQuadrado() + " e o circulo criado tem raio: " + circulo.getRaioCirculo();			
		}

		return toString;
	}
}

Basicamente, cada IF e ELSE são os cenários (branches) a serem testados.

Por exemplo:

Caso a altura e largura do retangulo seja maior que zero, e todo o resto seja igual a zero, qual deverá ser o retorno?

Esse é um cenário a ser validado no teste, e o mesmo deve ser feito para todos os outros cenários.

Uma coisa que o teste pode falar é sobre a complexidade do código. Se o teste se tornar algo mais complexo do que deveria ser, pode significar que o código a ser testado tb está mais complexo do que deveria ser também.

No método que vc está testando, por exemplo, ele faz o cálculo da área, de perímetro e ainda monta as características das figuras. Os testes seriam mais simples se vc separar isso em métodos diferentes e, consequentemente, o código ficaria mais simples e limpo.

Acho que entendi…

Você poderia colocar um modelo de como seria o teste?
Estou estudando a questão de acoplamento e é sugerido usar o CompareTo no lugar dos ifs…

Algo mais ou menos assim:

public class ResultadosTest {

  private Resultados fixture = new Resultados();

  @Test
  public void deveMontarMensagemComCalculoDaAreaRetangulo() {
    // Arrange (crie os parâmetros de acordo com o cenário a ser testado)
    FigurasGeometricas retangulo = //...;
    FigurasGeometricas quadrado = //...;
    FigurasGeometricas circulo = //...;

    // Act
    String actual = fixture.mostraInformacoes(retangulo, quadrado, circulo);

    // Assert
    Assertions.assertEquals("texto que é esperado da execução", actual);
  }
}

Pensa assim, se o código a ser testado for grande e complexo, o teste provavelmente será grande e mais complexo de fazer para conseguir realizar o teste desejado. O ideal é vc identificar isso, e otimizar seu código para que o teste seja o mais simples possível.

Por exemplo, em vez de ter um método que faça todas essas coisas, vc poderia dividir em métodos menores e testá-los separadamente:

public static String calcularArea(FigurasGeometricas retangulo, FigurasGeometricas quadrado, FigurasGeometricas circulo) { // ... }

public static String calcularPerimetro(FigurasGeometricas retangulo, FigurasGeometricas quadrado, FigurasGeometricas circulo) { // ... }

public static String apresentarInformacoes(FigurasGeometricas retangulo, FigurasGeometricas quadrado, FigurasGeometricas circulo) { // ... }

Esse é um exemplo, mas vc poderia otimizar ainda mais.

O método compareTo, da interface Comparable serve para implementar uma verificação de quem é maior.

Obrigado, pela a ajuda.mas acho que não vai ter como usar o compareTo, dar erro diz que não pode comparar com um tipo primitivo.

Eu fiz praticamente igual a esta forma, falta apenas realizar os testes.
Muito obrigado!

Você pode me ajudar com relação a minha classe principal como seriam os testes que eu poderia fazer. Não encontrei nada nos grupos de discussão que me desse uma ideia…

public class BrincandoComAsFigurasGeometricas {

	public static void main(String[] args) throws Exception {
		
        //Criando variaveis
		int alturaDoRetangulo = 0;
		int larguraDoRetangulo = 0;
		int ladoDoQuadrado = 0;
		int raioDoCirculo = 0;

		//Inicializando as variaveis
        alturaDoRetangulo = 2;
		larguraDoRetangulo = 4;
		ladoDoQuadrado = 5;
		raioDoCirculo = 3;
		
		//
		try {//Instanciando as variaveis
			FigurasGeometricas retangulo = new FigurasGeometricas(alturaDoRetangulo, larguraDoRetangulo);
			FigurasGeometricas quadrado = new FigurasGeometricas(ladoDoQuadrado);
			FigurasGeometricas circulo = new FigurasGeometricas(raioDoCirculo);
			
			//Gerando saidas
			System.out.println(Resultados.mostrarArea(retangulo, quadrado, circulo));
			
			System.out.println(Resultados.mostraPerimetro(retangulo, quadrado, circulo));
			
			System.out.println(Resultados.mostrarCaracteristicas(retangulo, quadrado, circulo));			
			
		} catch (Exception e) {
			throw new Exception(e);
		}

	}

}

O que vc deve testar é a classe Resutados e não a classe principal. Até dá para testar a classe principal, mas o ganho é muito pouco. Vc teria que fazer mock da impressao no console para comparar a saída, o que é algo mais complexo de fazer. Veja:

Classe principal com os System.out.printlns:

public class Principal {
	public static void main(String[] args) throws Exception {		
		System.out.println("Hello world");
	}
}

Teste da classe principal:

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class PrincipalTest {
	
	private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
	private final PrintStream originalOut = System.out;
	
	@BeforeEach
	public void setUpStreams() {
	    System.setOut(new PrintStream(outContent));
	}
	
	@AfterEach
	public void restoreStreams() {
	    System.setOut(originalOut);
	}

	@Test
	void test() throws Exception {
		Principal principal = new Principal();
		principal.main(new String[] {});
		
		// Aqui é validado se a saída do console foi realmente "Hello world\n" (\n pq é um println)
		assertEquals("Hello world\n", outContent.toString());
	}
}

Entendi, muito obrigado!