sirve - mostrar datos en una jtable java netbeans
Usar la tabla de datos de Spock para llenar objetos (4)
Básicamente no hay tal mecanismo que estés buscando. Si necesita proporcionar valores predeterminados para algunos objetos / campos, debe hacerlo usted mismo y no hay nada extraño, malo o inusual al respecto. Recuerde que la calidad del código de prueba es tan importante como el código de producción y no es una mala práctica crear algún código auxiliar que se use solo para pruebas (por supuesto, este código solo existe en la jerarquía de pruebas).
En este caso particular, en lugar de crear A
clase, puedes usar la construcción Map.withDefault
, pero IMO usando una clase dedicada es mucho mejor.
Estoy usando Spock por primera vez. Dado que estamos usando un modelo de dominio complejo, sería útil tener un mecanismo que me permita crear objetos completos a partir de los datos proporcionados por las tablas de spock. No quiero dar todos los valores cada vez, solo quiero configurar los valores en definido en datable. Entonces debería haber valores predeterminados definidos en alguna parte.
Sí, sé que podría escribir por mi cuenta, pero tal vez haya una solución lista para usar.
Ejemplo
class A {
String name
int age
}
mesa de spock
id | givenA | ...
1 | [name: "Michael"] | ...
2 | [name: "Thomas", age: 45 ] | ...
- => A.name = "Michael", A.age = definido por defecto en alguna parte
- => A.name = "Thomas" A.age = 45 (porque sobrescribo el valor predeterminado)
No estoy seguro de qué es exactamente lo que está buscando, pero en lugar de [name: "Thomas", age: 45]
, puede escribir una new A(name: Thomas, age: 45)
. Si quiere reutilizar accesorios, puede hacer:
where:
[id, givenA] << staticUtilityMethodThatReturnsCollectionOfTwoElementCollections()
También puede crear una pequeña API (o usar las operaciones de recolección integradas de Groovy) para modificar los valores predeterminados.
¿Por qué no usarás un patrón de construcción para esto? Podría proporcionar un método que creará un objeto A concreto con valores predeterminados, por ejemplo
A.builder()
.withDefaults(HereAreDefaultValues.class)
.withName(''Michael'')
.build()
Este ejemplo usa una clase separada para almacenar valores predeterminados y debe copiar todas esas propiedades en la etapa de compilación. También puedes usar un Mapa para esto.
En este caso, cualquiera que lea su prueba más adelante podrá verificar cuáles son los valores predeterminados y no se sorprenderá si la prueba falla cuando se cambian los valores predeterminados. Debe evitar ocultar detalles como los valores predeterminados de sus compañeros de equipo (o incluso de usted), ya que hace que sus pruebas sean muy difíciles de mantener. El ejemplo de Builder es más detallado, lo sé, pero definitivamente es más útil como artefacto de su software.
En cada proyecto que tengo, creo lo que llamo ''UnitTestUtils'' y esta clase contiene principalmente métodos de ayuda que crean objetos de dominio con valores predeterminados y permiten anulaciones de esos valores. Por ejemplo:
Person createTestPerson(Map overrides = [:]){
Person p = new Person(name: "Jim Bob", age: 45)
overrides.each { String key, value ->
if(p.hasProperty(key)){
p.setProperty(key, value)
} else {
println "Error: Trying to add property that doesn''t exist"
}
}
return p
}
Luego puede hacer uso de este método en su clase creando un mapa de la misma manera que ya lo hizo.
void "my test"(){
given:
Person person
when:
person = UnitTestUtils.createTestPerson(givenA)
then:
person.name == expected.name
person.age == expected.age
where:
id| givenA | expected
1 | [name: "Joe"] | [name: "Joe", age: 45]
2 | [age: 5] | [name: "Jim Bob", age: 5]
}
No se trata de una función Spock incorporada, pero debería ser muy útil para el caso de uso que haya especificado.