Ich habe folgenden Code.

public interface Animal{

    void eat();
}

public class Lion implements Animal{

    @Override
    public void eat() {
        System.out.println("Lion can eat");
    }
    public static void main(String[] args) {

        Animal lion = new Lion();
        lion.eat();
        lion.eat();
        lion.eat();
    }
}

Wie Sie sehen, rufe ich dreimal eat() an. Wie kann ich berechnen, wie oft es aufgerufen wird?

Beachten Sie, dass, Sie können die eat() Methode aus der Klasse Lion nicht ändern.

3
Kapil 18 Jän. 2019 im 16:23

3 Antworten

Beste Antwort

Sie können Dekorationsmuster mit der Animal -Schnittstelle und Ihrer Lion -Instanz verwenden:

public class EatingDecorator implements Animal {
  private Animal target;
  private int counter;

  public EatingDecorator(Animal target) {
    this.target = target;
  }

  @Override
  public void eat() {
    target.eat();
    counter++;
  }

  public int getCounter() {
    return counter;
  }
}

Und dann anwenden

Animal lion = new EatingDecorator(new Lion());
lion.eat();
lion.eat();
lion.eat();
System.out.println(((EatingDecorator) lion).getCounter()); // 3
11
Karol Dowbecki 18 Jän. 2019 im 13:34

Die Verwendung von Proxy kann helfen. In vielen Fällen können wir den Code nicht ändern, aber wir können einen Proxy erstellen und das tun, was Sie wollen.

Code wie folgt:

public class Lion implements Animal {
    @Override
    public void eat() {
        System.out.println("Lion can eat");
    }
public static AtomicInteger counts = new AtomicInteger(0);
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Lion.class);
        enhancer.setCallback((MethodInterceptor) (obj, method, args1, proxy) -> {
            counts.getAndIncrement();
            return proxy.invokeSuper(obj, args1);
        });
        Animal lion = (Lion) enhancer.create();
        lion.eat();
        lion.eat();
        lion.eat();

        System.out.println("method called " + counts.get() + " times");
    }
}

Cglib-Abhängigkeit

    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.2.10</version>
    </dependency>
5
TongChen 18 Jän. 2019 im 13:37

Sie könnten eine Testeinheit mit mockito erstellen - Sie führen den Test aus und implementieren ihn mit folgendem Code:

Mockito.verify (mock, times (4)). Send ();

-1
user10929745 18 Jän. 2019 im 13:26