Java - Non-static method 'age()' cannot be referenced from a static context

 
Vista:
sin imagen de perfil

Non-static method 'age()' cannot be referenced from a static context

Publicado por Xavi (21 intervenciones) el 12/10/2021 18:43:36
Hola,

Soy nuevo en Java. Estoy intentando diseñar un test para un método que he implementado llamado age() que calcula la edad de un atleta en base al parámetro "birthYear" de tipo entero (int). La clase ha sido diseñada de la siguiente manera:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.time.LocalDate;
 
public class Athlete {
    // Inicialización de los atributos por defecto
    private int id;
    private static int nextId=0;
    private String name;
    private String surname;
    private int birthYear;
    private boolean medalist;
    private char gender;
    private String nationality;
 
public Athlete() {
        this("lorem", "ipsum",1982,false,'m',"SPA");
        }
 
    public Athlete(String name, String surname, int birthYear, boolean medalist, char gender, String nationality) {
        setName(name);
        setSurname(surname);
        setBirthYear(birthYear);
        setMedalist(medalist);
        setGender(gender);
        setNationality(nationality);
        setId();
    }
 
    // Getter BirthYear
    public int getBirthYear(){
        return birthYear;
    }
 
    // Setter BirthYear
    public void setBirthYear (int birthYear){
        if (birthYear < 1900 || birthYear > 2010) {
            System.out.println("[ERROR] Athlete's birth year must be in range [1900,2010]");
        }else{
            this.birthYear = birthYear;
        }
    }
 
   // Método no clasificado como getter ni setter llamado age()
  public int age () {
        int age;
        // Si el año es negativo
        if (this.birthYear < 0) {
            System.out.println("[ERROR] Athlete's birthYear cannot be a negative number");
            return -1;
        // Si el año de nacimiento es mayor al año actual
        } else if (this.birthYear > LocalDate.now().getYear()) {
            System.out.println("[ERROR] Athlete's birthYear cannot be after current year");
            return -1;
        } else {
            age = LocalDate.now().getYear() - this.birthYear;
        }
        return age;
    }

No he incluido todos los setters y getters, sinó únicamente el de birthYear. He diseñado el siguiente test:

1
2
3
4
5
6
7
8
void testAge() {
        // Valor esperado es age = 67 ya que 2021 - 1954 = 67
        assertEquals(67, Athlete.age(1954));
        // Valor esperado es -1 ya que se está pasando una edad negativa
        assertEquals(-1, Athlete.age(-1954));
        // Valor esperado es -1 ya que se está pasando un año posterior al actual
        assertEquals(-1, Athlete.age(2022));
    }

Sin embargo, el test no funciona adecuadamente y se muestra como INVALIDO debido a lo siguiente:

1
Non-static method 'age()' cannot be referenced from a static context

A qué se refiere? Cómo podría solucionarlo?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Non-static method 'age()' cannot be referenced from a static context

Publicado por Kabuto (1381 intervenciones) el 12/10/2021 21:17:43
El método age() es "no estático", es decir, no puedes invocarlo directamente.
Has de crear un objeto de clase Athlete para poder llamarlo.

Además, en tu test intentas pasarle un valor int, un año de nacimiento.
1
assertEquals(67, Athlete.age(1954));

Pero este método no está declarado para recibir ningún int como argumento entre los paréntesis.
1
public int age () {

Si quisieras que puede recibir un int, habría que declararlo así:

1
public int age (int birthYear) {

Pero no parece que sea ese el camino a seguir. La clase Athlete ya tiene un atributo birthYear con el que ha de computar ese método age().
Tan solo necesitas crear un objeto Athlete para poder trabajar con él

1
2
3
4
5
6
7
8
9
10
11
12
void testAge() {
        Athlete atleta = new Athlete();
        // Valor esperado es age = 67 ya que 2021 - 1954 = 67
        atleta.setBirthYear(1954);
        assertEquals(67, atleta.age());
        // Valor esperado es -1 ya que se está pasando una edad negativa
        atleta.setBirthYear(-1954);
        assertEquals(-1, atleta.age());
        // Valor esperado es -1 ya que se está pasando un año posterior al actual
        atleta.setBirthYear(2022);
        assertEquals(-1, atleta.age());
    }

Por cierto, no he probado el código, pero intuyo que los dos últimos assertEquals() no van a dar el resultado esperado.
Si es así, tendrás que revisar la lógica que has seguido en el método setBirthYear()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar