Pergunta

Meu programa tem uma rotina diária, semelhante a um evento despertador. Diga, quando é 02:00 (O tempo é a hora do sistema no meu pc), fazer algo por mim.

O que eu quero fazer é acelerar o período de testes eu li no wiki de Mock objeto , o escritor DID programa despertador menção. Eu estava tão feliz de ver mas ainda assim, não sei como fazê-lo.

Eu sou novo para Mock Object, e estou programando em Java. Então JMock ou EasyMock (ou qualquer similar) pode bom para mim.

Graças

Foi útil?

Solução

Sempre que você precisa para obter o tempo atual, não use o relógio do sistema diretamente - usar uma interface como:

public interface Clock
{
    long currentMillis();
}

Você pode então implementar isso com um relógio do sistema para a produção, e passar uma farsa para testes, onde você pode definir o falso a qualquer hora que quiser.

No entanto, você também precisará zombar de tudo o que está dirigindo o seu sistema? - você está explicitamente à espera de um tempo particular, ou que outra coisa chamar seu código

Outras dicas

Eu tenho que pedir desculpas já que você perguntou sobre java e estou fora para almoçar quando se trata de java, mas uma solução é para zombar o objeto DateTime e configurá-lo para o tempo desejado.

Em .NET seria algo parecido com isto:

public static class SystemTime
{
    public static Func<DateTime> Now = () => DateTime.Now;
}

SystemTime.Now = () => new DateTime(2000,1,1);

De: lidar com o tempo em testes


... [A] n programa de alarme que provoca uma sino a tocar em um certo poder de tempo obter o tempo atual de fora mundo. Para testar isso, o teste deve esperar até a hora do alarme de saber se ele tem tocado a campainha corretamente. Se um objeto de simulação é usada em lugar do objeto real, pode ser programado para fornecer o sino-toque tempo (se é verdade que o tempo ou não) para que o despertador programa pode ser testado em isolamento.

Este despertador que você está fazendo referência é dando um exemplo de zombando de um objeto. Não é realmente um objeto que você pode usar a partir do quadro simulada.

Basicamente o que você faz no teste é falso os eventos do relógio. Exatamente como depende um pouco sobre o projeto, e como você está esperando para o evento, mas para mantê-lo simples (se não pura) a minha abordagem seria a de ter um método que é chamado quando o evento de tempo é acionado, e depois testar ambos os lados disso.

Primeiro é testar chamando o método e vendo que o evento programado faz o que você espera. Então zombar daquela classe (com JMock a forma preferida é torná-lo uma interface e ter o seu método chamando implementar essa interface).

Você, então, passar o mock para a classe que manipula o timing. Aqui, novamente, gostaria de abstrair a rosca / desencadeando problemas (tais como verificar o relógio do sistema e iniciar o thread) e têm simulações retornar valores que, essencialmente, executar o evento imediatamente.

Em seguida, manter o código real que realmente lê o relógio do sistema e inicia o segmento tão pequenos quanto possível, e que será a área que não está sob teste de unidade.

Mocking refere-se a testes de unidade. Para a funcionalidade que você está descrevendo eu iria separar o gatilho (no seu caso o evento despertador) do processo (seja ele qual é o seu 'rotina diária' está fazendo) e teste de unidade a funcionalidade do processo.

Em seguida, direcionar sua atenção para o código de programação que irá chamar a sua funcionalidade processo. Eu recomendaria usar algo como Quartz para isso, mas se você estiver indo para role-o -own o teste de unidade para que ele possa trabalhar com o relógio do sistema actual, desde que você atribuir o tempo de disparo com base no valor atual do relógio do sistema como tudo que você estará testando para é que o evento de disparo ocorre.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top